IOはどのようにモナドですか?


7

私はHaskellプログラミング言語を学んでいます。私が読んでいるものから、入力/出力(IO)はHaskellの純粋さに対する課題を引き起こします。なぜなら、定義により、私たちは外の世界と相互作用しているからです。ウィキペディアから:

Haskellなどの純粋に関数型の言語では、関数は、関数のセマンティクスの一部として、外部から見える副作用を持ちません。関数は直接的な副作用を引き起こすことはできませんが、呼び出し側が都合のよいときに適用する必要のある副作用を説明する値を作成できます。

Haskell表記では、タイプIO aの値は、実行時にタイプaの値を生成するアクションを表します。

すぐに、IOがHaskellモナドの例であることを知りました。モナドが何であるかについての多くの説明はありませんが。ファンクタ、Applicatives、そしてモナドでの写真

モナドについて学ぶ方法:

  1. コンピュータサイエンスの博士号を取得します。
  2. このセクションでは必要ないので、捨ててください!

これまでに、私はさまざまな定義を読みました。それらは、コンテキストを追加したり、特定の概念に基づいて大きな言語の中に小さなプログラミング言語を作成したりしています。それでも、どのモナドとそれらのアイデアがどのように適用されるかを理解しようとしています。

Haskellにmonadは、もう1つの型クラスがあり、基本的にそれを定義するルールは1つだけです。そしてIOその一例です。

class Monad m where    
    (>>=) :: m a -> (a -> m b) -> m b  

/programming/44965/what-is-a-monad

ここで代数学が起こっていますか?IOの代数とは何ですか?


言語固有であることをお詫び申し上げます。私の希望は、この議論のほとんどがすべての関数型プログラミング言語に当てはまることです。私の議論における誤りは、この領域についての私自身の限られた理解を表しています。

私がnLabで見つけたモナドの別の定義があり、それはプログラミング言語にさえ特定されていません。

別の質問で、Haskellの場合のモナドのカテゴリー理論の概念がCSの定義とどのように一致するかを理解したいと思います。

回答:


9

TLDR:Haskellの型と関数は、カテゴリを形成し、それから、私たちはしているものに気づく>>=と、returnモナドのためのルールを満たします。

あるタイプがモナドのトリプレットの一部であることの意味を考えるために、まずハスケルの意味でのカテゴリーの意味を考えなければなりません。

カテゴリHaskをHaskell型のオブジェクトとして定義し、矢印を関数として定義します。各アイデンティティー矢印はのインスタンスでidあり、コンポジションは通常.です。これらが通常のコヒーレンス条件を満たすことは簡単です。

Haskの内部関数を見ることができます。には2つの部分、型から型へのマップ、関数から関数へのマップが含まれているため、

  • map g . map f = map (g . f)
  • map id = id

したがって、ファンクタは、(map矢印a -> bを矢印に持ち上げる関数と対になっている)型コンストラクタ(型を型にマップする)F a -> F bです。また、それらの間の自然な変換F aを、メンバーをG a通常のコヒーレンス条件を満たすメンバーに「スライド」させるものとして定義することもできます。

  • nat . fmap f = fmap f . nat

したがって、自然な変換はタイプ

nat :: forall a. F a -> G a

最後に、アイデンティティー型コンストラクター

type Id a = a

アイデンティティによって与えられたマップを持つファンクターです。

モナドを議論する準備が整いました!モナドは3つのものの3つ組です。

  • ファンクター、 F
  • 自然形質転換returnの間Id及びF
  • 自然形質転換joinの間F x F及びF

そのコヒーレンス条件付きjoin . fmap join = join . joinjoin . fmap return = join . return = id

ここで、xとは、タイプコンストラクターの構成によって定義される2つのファンクターの積を意味します。

IOモナドが持っていますreturn :: a -> IO a Id a -> IO a。それが私たちの最初の自然な変化です。私たちの目はそれほど簡単ではありませんが、我々は定義することができるjoinよう

join :: IO (IO a) -> IO a
join = (>>= id)

joinシーケンス操作と見なすことができます。これは、外側の構造に格納されているすべてのアクションIOを取得し、それらを内側のすべてのアクションの前に貼り付けIO、より大きくフラットなものを返しIO aます。

つまり、本質的に、カテゴリ理論ではモナドの抽象的な概念があり、Haskellの型はカテゴリとして表示できるため、モナドのような通常のカテゴリ理論の概念を適用して、それらから共通のパターンを取得できます。それでおしまい。これらの一貫性の条件を超えてモナドに高い意味を与える秘密のカテゴリー理論のジュースはありません。

これは実際には非常に一般的なパターンです。論理、セマンティクス、タイプシステムなど、カテゴリのあるものを見るときはいつでも、過去100年の研究を盲目的に新しいカテゴリに適用し、「新しい」抽象化を発見できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.