3

2 つの数値の合計の結果を出力するにはどうすればよいですか?

 main:: IO()
 main = do putStrLn "Insert the first value: "  
        one <- getLine  
        putStrLn "Insert the second value: "  
        two <- getLine    
        putStrLn "The result is:"
    print (one+two)

これは私にエラーを与えます:

  ERROR file:.\IO.hs:3 - Type error in application
  *** Expression     : putStrLn "The result is:" print (one + two)
  *** Term           : putStrLn
  *** Type           : String -> IO ()
  *** Does not match : a -> b -> c -> d
4

3 に答える 3

10

readLnの代わりに使用してみてくださいgetLine

getLineはモナドに aStringを返し、s を追加することはできません。IOString

readLn多相的な戻り値の型があり、コンパイラは戻り値の型がInteger(IOモナド内に) あると推測するので、それらを追加できます。

于 2013-01-12T10:41:00.523 に答える
4

あなたのエラーは、括弧を使用していないことに関連していると推測します。

また、getLine文字列を生成するため、正しい型に変換する必要があります。を使用readして数値を取得できますが、文字列を解析できない場合はエラーが発生する可能性があるため、読み取る前に数値のみが含まれていることを確認することをお勧めします。

print (read one + read two)

優先順位に応じて、変数はprintto ではなくfor のパラメーターとして属するように解析される場合があります+。括弧を使用することで、変数が に関連付けられ+、その結果のみがprint.

最後に、インデントが正しいことを確認します。ここに貼り付けた方法は、do 式では正しくありません。最初の putStrLn は、残りと同じインデント レベルにある必要があります - 少なくとも ghc はそれについて文句を言います。

于 2013-01-12T10:02:51.170 に答える
2

この方法でコードを変更するには、read :: Read a => String -> a

 main:: IO()
 main = do putStrLn "Insert the first value: "  
        one <- getLine  
        putStrLn "Insert the second value: "  
        two <- getLine    
        putStrLn "The result is:"
    print ((read one) + (read two))
于 2013-01-12T12:14:51.750 に答える