2

これは私が持っているものです、私はこのような出力が欲しいです

*Main> sumThree
Please enter three integers:
1
2
3
Their sum is: 6
(1,2,3)

しかし、私は合計なしで、取得し続けます

*Main> sumThree
Please enter three integers:
1
2
3
Their sum is:
(1,2,3)

**summ :: Integer -> Integer -> Integer -> IO Integer
summ x1 x2 x3 = return(x1+x2+x3)
sumThree :: IO (Integer, Integer, Integer)
sumThree = do putStr "Please enter tree integers:"
              x1 <- getInteger
              x2 <- getInteger
              x3 <- getInteger
              putStr "Their Sum is: "
              summ x1 x2 x3
              return(x1,x2,x3)**
4

2 に答える 2

2

の結果を実際に印刷する必要がありsummます。

関数に含めないreturnでください。summ関数の結果タイプがIntegerとは対照的になりIO Integerます。次に、

putStr (show (summ x1 x2 x3))

だけでなくsumm x1 x2 x3

sumまた、組み込み(プレリュード)機能についてご存知ですか?の配列がNum必要なので、を実行できますputStr (show (sum [x1, x2, x3]))

于 2013-02-19T02:03:54.743 に答える
1

ここであなたのコードを少し読みすぎているかもしれないので、間違っている場合は訂正してください。しかし、Haskellプログラムの仕組み、特にその意味について混乱しているようですreturn

returnHaskellでは、多くの命令型プログラミング言語でおなじみのreturnステートメントではありません。returnHaskellでは関数です。他の関数と同様に、引数に適用して値を計算します。フロー制御には影響しません。特に、現在の関数によって計算された値として引数が「返される」ことはありません。

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)

インタプリタはsumThreeIOアクションを評価しています。このアクションでは、3つの整数を入力するように求められ、「それらの合計は:」と出力され、値が生成されます(1, 2, 3)sumThreeアクション自体はその後何も出力しません。"Their sum is:"それを出力するのはインタープリターであり、を実行して生成された値を出力しますsumThree

sumThreeこれは、 ;によって生成される値を決定するdoブロックの最後のものです。この場合、それはreturn(x1,x2,x3)です。したがって、タプルを明示的に取得し、それをでアクション(x1, x2, x3)にラップしているため、3つの数値の合計になる可能性がないことがわかります。これが結果です。IOreturn

最後から2番目の行:

summ x1 x2 x3

アクションですIO(のタイプのおかげInteger -> Integer -> Integer -> IO Integersumm)。したがって、そこに座ることが許可され、その価値を生み出すために「実行」されますが、あなたはそれで何もしません!

つまり、2つのことです。

  1. summreturnまったく必要ありません
  2. 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)
于 2013-02-19T06:20:57.290 に答える