2

haskellプログラムで使用する2つの異なる方法がありますIO。例えば:

main :: IO ()
-- and
readLine :: IO Int

これら2つの違いは何ですか?

4

4 に答える 4

6

IO ()IO Int基本的に非常に似ています。 Int()Haskellの両方のタイプです。 ()値が1つしかないという意味でのみ特別であるため(())で示されるため、実際には関心がありません。

于 2012-09-19T14:25:53.597 に答える
5

唯一の違いは、それらの戻り値です。 mainタイプの値を返し、()あなたはをreadLine返しますInt。おそらく、この例が役立つでしょう:

main = do
    x <- putStrLn "Test"
    print x

実行すると、次のように出力されます。

>>> main
Test
()

printステートメントはaを出力します。これは、次()の戻り値であるためですputStrLn

putStrLn :: String -> IO ()

通常、のようなものの戻り値をバインドしない理由は、何putStrLnがあっても常に返されるため、そうすることで得られる情報がないため()です。

于 2012-09-19T15:24:55.727 に答える
1

IO Intつまり、これはreturnIntであるIOアクションです。

IO ()つまり、これは意味のある結果を返さないIOアクションです。(のようにmain。)

于 2012-09-19T14:20:34.310 に答える
1

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 ()、型コンストラクターによって追加された構造のみを考慮し、その「内部」の値は考慮しません。

于 2012-09-20T00:23:33.623 に答える