対GHC実装意味数学的な観点から、1つの入力を取り、型IO()
の値を返す関数であり、ここでIOモナド:数学的意味
ioFunction :: String -> IO()
ioFunction str = do putStrLn str
putStrLn "2"
、ioFunction
検討します。私はそれが何も意味しないと推測します。つまり、数学的には、この関数は値を返し、それ以外は何も返しません。特に、何も印刷しません。
これは、ハスケルが命令的な副作用(この場合、この関数を実行すると、最初にstr
を印刷し、次に "2"をその順に印刷する)のためにIOモナドを使用する方法は、純粋にGHC実装の詳細は、数学的(そしてある意味ではハスケル)の意味とは関係がありません。
EDIT:はこの質問をより明確にするために、私は例えば、ある依頼する何を意味するか、次の2つの機能の間のビューの数学的な点から任意の違いがあります:
ioFunction1 :: String -> IO()
ioFunction1 str = do putStrLn str
putStrLn "2"
ioFunction2 :: String -> IO()
ioFunction2 str = do return()
はそれ答えはいいえではないようです - 数学的観点から - 彼らはどちらも入力としてString
を受け取り、タイプIO()
の値(たぶん同じ値)を返します。これは当てはまりませんか?
これはちょっと混乱しています。例えば、モナドは隠された*状態を運んで話すことができ、実際に命令を実行することができます。 IOモナドは、私の意見では、オペレーティングシステムが本質的に持っているすべての種類の非確定的な振る舞いを隠すという点を除いて、モナドと共通しています。 –
私が言っていることは、GHCの観点から、ioFunctionはまず 'str'を出力してから「2」を出力します。しかし、数学的には、この関数は 'String'を取り、'():: IO() 'を返します。したがって、私たちがハスケルの副作用のためにIOモナドを使用するという事実は、ある意味では任意であり、(IO型の)(数学的)モナドの本質的な意味とは無関係です。 – George
関数は '()'を返さないので、IOモナド(関数である)を返し、そのモナドは最終的に '()'を返します。それは違うものです。実際、IOにはintrensic *という数学的な意味があります。 –