haskellプログラムで使用する2つの異なる方法がありますIO。例えば:
main :: IO ()
-- and
readLine :: IO Int
これら2つの違いは何ですか?
haskellプログラムで使用する2つの異なる方法がありますIO。例えば:
main :: IO ()
-- and
readLine :: IO Int
これら2つの違いは何ですか?
IO ()とIO Int基本的に非常に似ています。 Intと()Haskellの両方のタイプです。 ()値が1つしかないという意味でのみ特別であるため(())で示されるため、実際には関心がありません。
唯一の違いは、それらの戻り値です。 mainタイプの値を返し、()あなたはをreadLine返しますInt。おそらく、この例が役立つでしょう:
main = do
x <- putStrLn "Test"
print x
実行すると、次のように出力されます。
>>> main
Test
()
printステートメントはaを出力します。これは、次()の戻り値であるためですputStrLn。
putStrLn :: String -> IO ()
通常、のようなものの戻り値をバインドしない理由は、何putStrLnがあっても常に返されるため、そうすることで得られる情報がないため()です。
IO Intつまり、これはreturnIntであるIOアクションです。
IO ()つまり、これは意味のある結果を返さないIOアクションです。(のようにmain。)
IO ()タイプの値を抽出するために実行できるアクションのタイプ()です。型の(下部以外の)値は1つだけで()、これもスペルされます()(大文字で始まる名前が型コンストラクターであるのと同じように、型式と値式のどちらを見ているかを知ることで区別します)または、型式と値式のどちらを見ているかに応じて、データコンストラクター)。(ボトム以外の)値は1つしかないため、値はまったく何も示しません(厳密に言えば、少なくとも計算が正常に終了したことを示しますが、それだけです)。したがってIO ()、通常は、副作用のためにのみ関心があるIOアクションのタイプとして使用されます。
putStrLn "Hello World"タイプの値の例ですIO ()。興味深いものは何も計算されません。端末に文字列を書き込んだ結果の値は何ですか?実行されたときに取得する()ことは、それが実際に実行されたことを示すだけです。
IO Intタイプの値を抽出するために実行できるアクションのタイプIntです。すべてのIOアクションと同様に、それが正確に行うことは、プログラム外の世界に影響を及ぼし、影響を受ける可能性があります。Haskellはそれらについて何も知りません。Intしかし、アクションを実行すると、他に何をするかに関係なく、タイプがHaskell値になることはわかっています。
readLn :: IO Intは型の値の例です(あいまいさを避けるために、型の注釈はスタンドアロンの式として必要です。特定の操作で抽出されIO Intた値を実際に使用するより広いコンテキストでは、おそらく省略できます)。ターミナルに文字列を書き込むのとは異なり、ターミナルから文字列を読み取って変換すると、値が生成されます。readLnIntInt
より一般的にIOは、任意の型に適用できる型コンストラクターです。IO a実行できる実行のタイプであり、結果はタイプの値になりますa。上記の両方は、これの単なる例です。どちらも特別に処理されません。()は完全に通常のタイプであり()、そのタイプの完全に通常の値ですが、このような値は情報を伝達しないため(「この計算は正常に終了しました」以外)、通常は()それ自体では表示されません。これは、のように型コンストラクターが適用された場合にのみ使用される傾向がありIO ()、型コンストラクターによって追加された構造のみを考慮し、その「内部」の値は考慮しません。