2017-01-24 3 views
3

ハスケルを学び始めた後、多くの文書を読んだ後でも、ハスケルでは理解できないことがあります。機能プログラミング:実際に副作用はどこで起こりますか?

IO操作を実行するには、一種の「ブラックボックス」に値をラップした「IOモナド」を使用する必要があるので、IOモナドを使用する関数は純粋に機能します。 OK、それでは、IO操作は実際にどこで起こりますか?

モナド自体が純粋に機能的ではないという意味ですか?あるいは、IO操作が実装されています、Cで言えば、Haskellコンパイラの中に「組み込み」されていますか?

純粋なHaskellで、Monadの有無にかかわらず、IO操作を行うものを書くことができますか?もしそうでなければ、言語自体の中では不可能な場合、この能力はどこから来ますか?それがHaskellコンパイラの中に埋め込まれている/ Cコードの塊にリンクされているのであれば、それは最終的に "汚い仕事"をするためにIO Monadによって呼び出されますか?

+1

(これは私が100%確信しているわけではないのでコメントしています)私の理解は、IOは状態として「現実の世界」を持つ低レベル状態のモナドとしてモデル化されているということです。コンパイラ/ランタイムは実際には、オペレーティングシステムのAPIへのバインディングを使用して実装されたIO操作に変換します。純粋に関数型のプログラミングでは、何かを計算することはできますが、誰にもそれを伝えることはできません。現実の世界でのこれらのステートフルアクションを、基礎となるオペレーティングシステムへの実際の呼び出しに変換できるランタイムが必要です。 – bheklilr

+0

https://wiki.haskell.org/IO_inside#Welcome_to_the_RealWorld.2C_baby –

答えて

17

序文として、あまり書かれていない多くの紹介にもかかわらず、「IOMonad」ではありません。それはちょうど "IOタイプ"です。モナドには魔法はありません。 HaskellのMonadクラスは、非常に退屈なことです。ほとんどの言語がサポートできるものに慣れておらず、抽象的です。 「IOIOAlternative」とIOAlternativeを実装しているにもかかわらず、誰にも呼ばれることはありません。 Monadに集中することは、学習の仕方に過ぎません。

純粋な言語での効果の原理処理(ではなく、の副作用)の概念的な魔法は、IOタイプの存在です。それは本当のタイプです。これは "これは不純です"と言っている旗ではありません。これは、Maybeまたは[]のような完全なHaskellタイプの* -> *です。 IO a -> IO (Maybe a)のように、IO値を引数として受け入れるタイプのシグネチャは意味があります。ネストされたIOを持つ型シグネチャは、IO (IO a)のように意味があります。

実際のタイプの場合、具体的な意味を持っている必要があります。タイプとしてMaybe aはタイプaの可能性として欠損値を表します。 [a]は、aの0以上の値を意味します。 IO aは、タイプaの値を生成する一連のエフェクトを意味します。

IOの目的は、一連の効果を表すことにあります。私が上記のように、彼らは副作用ではありません。彼らはプログラムの害のない葉に隠れることができず、他のコードの背後にあるものを不思議に変えます。代わりに、効果は、それがIO値であるという事実によってむしろ明示的に呼び出されます。これは人々がIOタイプを使用してプログラムの部分を最小化しようとする理由です。あなたがそこで行うことが少ないほど、距離を置いてあなたのプログラムを妨害する恐ろしい行動のための方法は少なくなります。

質問の主な推論として、完全なHaskellプログラムは、mainと呼ばれる値IOと、それが使用する定義のコレクションです。コンパイラは、コードを生成するときに、実質的に一連のエフェクトを実行するコードのハスケルではないブロックを、IOの値で挿入します。ある意味では、これはサイモン・ペイトン・ジョーンズ(GHCの長年の著者の一人)が彼の話で得ていたものですHaskell is useless

実際にIOアクションを実行するものは概念的に純粋なままではありません。(そして、Haskell言語内でIOアクションが実行される非常に不純な関数がありますが、それは外部関数のインタフェースをサポートするために追加されたものではなく、不適切に使用するとプログラムが非常に悪くなります) Haskellのポイントは、エフェクトシステムに原理的なインターフェースを提供し、根本的でないビットを隠すことです。それは実際には実際には非常に便利なやり方です。

関連する問題