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
つまり、これはreturn
Intである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
た値を実際に使用するより広いコンテキストでは、おそらく省略できます)。ターミナルに文字列を書き込むのとは異なり、ターミナルから文字列を読み取って変換すると、値が生成されます。readLn
Int
Int
より一般的にIO
は、任意の型に適用できる型コンストラクターです。IO a
実行できる実行のタイプであり、結果はタイプの値になりますa
。上記の両方は、これの単なる例です。どちらも特別に処理されません。()
は完全に通常のタイプであり()
、そのタイプの完全に通常の値ですが、このような値は情報を伝達しないため(「この計算は正常に終了しました」以外)、通常は()
それ自体では表示されません。これは、のように型コンストラクターが適用された場合にのみ使用される傾向がありIO ()
、型コンストラクターによって追加された構造のみを考慮し、その「内部」の値は考慮しません。