2013-03-03 7 views
13

haskellのpureとimpureの違いは何ですか? haskellでIOを実行するとき、純粋なアイテムと不純なアイテムを別々にすることはどういう意味ですか?純粋なものと不純なものとの違いは何ですか?

+10

これはトリックです! Haskellのすべてが純粋です。何か不潔なものを得るためには、Haskellの外に出なければなりません(ランタイムシステムのように)。 (...しかし、これはあなたのハスケル経験の非常に遅くまで役立つ答えではありません。) –

答えて

20

基本的にあなたは「不純なセクション」に可能な限り小さなコードを維持したいです。 IOモナドに書かれたコードは、永久に不安定に汚染されています。 IO Intという記号を持つ関数は、IOモナドの整数を返しますが、核のミサイルを月に送ることができます。私たちはコードのすべての行を調べずに知る方法がありません。

たとえば、文字列を受け取り、 "、dude"という文字列を追加するプログラムを作成したいとします。

main = do 
    line <- getLine 
    putStrLn $ line ++ ", dude" 

コードの一部は、副作用があるため、IOモナドに存在する必要があります。これには、getLineとputStrLnが含まれます。しかし、2つの文字列をまとめることはできません。

main = do 
    line <- getLine 
    putStrLn $ addDude line 

addDude input = input ++ ", dude" 

addDudeのシグネチャは、それが純粋であることを示します。String -> String。いいえIOここにはありません。これは、addDudeが少なくともそのように動作すると仮定できることを意味します。 1つの文字列を取り、1つの文字列を返します。それが副作用を持つことは不可能です。それは月を爆破することは不可能です。

+2

素敵な答え。コードの入力ミスを修正する自由を取るための謝罪。私はまた、コードに存在するならば、 'addDude'の署名が純粋さを示す上でより良いと示唆しています。明示的な型シグネチャを記述するための1つの理由は、正確に文書化して、悪いものが確実に起こらないことを確認することです。 – pigworker

+0

+1クールな答え、おい! – Landei

+0

@pigworker、ありがとう!あなたが知っている、私はそこに置くことを考えました、それは重要であるかどうか分からなかったので、私は簡潔に行きました。 –

5

純度は単に不純な機能から純粋分離なし副作用(ロボットアームを動かし、ディスクからの読み取りなど)を生じない

を意味は、あなたがあなたのコードを実行するために何が起こっているかについての詳細を知ることができることを意味します。たとえば、1 + 2と言うときは、そのタイプ(Int -> Int -> Int)で、唯一のことは2つの数字をとり、3番目の数字を生成するということが分かります。タイプがInt -> Int -> IO Intの場合、2つの数字を追加するたびにロボットアームを動かすことがあります。

ハスケルの基礎のための良い出発場所はここで見つけることができます: http://learnyouahaskell.com/introduction#so-whats-haskell

2

ハスケルのすべてが純粋です。あなたが読んでいるものは、IO mondadと外部のコードの可能性が高いです。あなたがIOモナドに何かを置くと、決して "脱出"できません - あなたはIOモナドにいなければなりません。したがって、IOモナドはあなたのコードを「侵入」する傾向があります.IOを返すものがあれば、それを呼び出すコードもIOを返さなければなりません。したがって、IOモナドは、プログラムの最上位レベルで必要なところだけで使用し、純粋な関数である計算の任意の部分を分離することが最善です。

関連する問題