ここであなたのコードを少し読みすぎているかもしれないので、間違っている場合は訂正してください。しかし、Haskellプログラムの仕組み、特にその意味について混乱しているようですreturn
。
return
Haskellでは、多くの命令型プログラミング言語でおなじみのreturnステートメントではありません。return
Haskellでは関数です。他の関数と同様に、引数に適用して値を計算します。フロー制御には影響しません。特に、現在の関数によって計算された値として引数が「返される」ことはありません。
IO
モナドの場合、はreturn
このタイプの関数です。これはreturn :: a -> IO a
、任意のタイプの値を取り、「IO
そのタイプのバージョン」の値を提供することを意味します。の特定のケースではreturn
、その値を生成する何もしないIO計算を提供します。
これ:
summ :: Integer -> Integer -> Integer -> IO Integer
summ x1 x2 x3 = return(x1+x2+x3)
Haskellプログラマーにとっては非常に奇妙な関数です。3つの整数の合計を計算するためにIOを実行する必要はありません。それでは、なぜ結果タイプなのIO Integer
ですか?あなたがこれを書き込もうとしたように私には見えます:
summ :: Integer -> Integer -> Integer -> Integer
summ x1 x2 x3 = return(x1+x2+x3)
Integer
これは、モナディックタイプではないことについてのタイプエラーを与えたでしょう。タイプを変更することで修正できますが、タイプは3つの整数を合計する正しい式であったため、別の整数に変更するのはかなり奇妙です。return
関数の結果をコンピューター化する必要はまったくないので、代わりにこれを行うことができます。
summ :: Integer -> Integer -> Integer -> Integer
summ x1 x2 x3 = x1+x2+x3
同様に、あなたのsumThree
関数は非常に奇妙です。Haskellインタープリターでこれを行うとき:
*Main> sumThree
Please enter three integers:
1
2
3
Their sum is:
(1,2,3)
インタプリタはsumThree
IOアクションを評価しています。このアクションでは、3つの整数を入力するように求められ、「それらの合計は:」と出力され、値が生成されます(1, 2, 3)
。sumThree
アクション自体はその後何も出力しません。"Their sum is:"
それを出力するのはインタープリターであり、を実行して生成された値を出力しますsumThree
。
sumThree
これは、 ;によって生成される値を決定するdoブロックの最後のものです。この場合、それはreturn(x1,x2,x3)
です。したがって、タプルを明示的に取得し、それをでアクション(x1, x2, x3)
にラップしているため、3つの数値の合計になる可能性がないことがわかります。これが結果です。IO
return
最後から2番目の行:
summ x1 x2 x3
アクションですIO
(のタイプのおかげInteger -> Integer -> Integer -> IO Integer
でsumm
)。したがって、そこに座ることが許可され、その価値を生み出すために「実行」されますが、あなたはそれで何もしません!
つまり、2つのことです。
summ
return
まったく必要ありません
sumThree
実際に印刷したいものを印刷する必要があります
それをまとめると、次のようなものが得られます。
summ :: Integer -> Integer -> Integer -> Integer
summ x1 x2 x3 = x1 + x2 + x3
sumThree :: IO ()
sumThree = do putStr "Please enter tree integers:"
x1 <- getInteger
x2 <- getInteger
x3 <- getInteger
putStr "Their Sum is: "
putStr (show (summ x1 x2 x3))
sumThree
それはあなたがそれを印刷するだけでなく合計を生成したくない場合です。sumThree
値を出力するだけでなく生成する必要がある場合は、次のようなものが必要になります。
summ :: Integer -> Integer -> Integer -> Integer
summ x1 x2 x3 = x1 + x2 + x3
sumThree :: IO Integer
sumThree = do putStr "Please enter tree integers:"
x1 <- getInteger
x2 <- getInteger
x3 <- getInteger
putStr "Their Sum is: "
putStr (show (summ x1 x2 x3))
return (summ x1 x2 x3)