16

私は次のような単純な関数を持っています:

nth :: Integer -> Integer

そして、私はその結果を次のように印刷しようとします:

main = do
    n <- getLine
    result <- nth (read n :: Integer)
    print result

次のエラーが生成されます。

Couldn't match expected type `IO t0' with actual type `Integer'
In the return type of a call of `nth'
In a stmt of a 'do' expression:
    result <- nth (read n :: Integer)

またputStrLn、運が悪かった他の多くの組み合わせで試してみました。
私はそれを理解することができず、何かがこれらの周りでどのように機能するかを完全に理解していないので、私はいくつかの助けが必要ですIO

4

2 に答える 2

17

nthは関数であり、IOアクションではありません。

main = do
  n <- getLine
  let result = nth (read n :: Integer)
  print result
于 2012-04-21T23:55:50.133 に答える
5

構文はdo、モナド内で何かをアンラップします。矢印の右側にあるものはすべてIOモナド内に存在する必要があります。そうでない場合、タイプはチェックされません。あなたのIO Integerプログラムでは問題ないでしょう。do次のように記述される、より明示的な関数の構文糖衣です。

それを思い出します(>>=) :: m a -> (a -> m b) -> m b

main = getLine >>= (\x ->
       nth >>= (\y ->
       print y))

ただしnth、これは一項値ではないため、関数を適用する意味はありません。この関数(>>=)には、タイプが必要ですIO a

于 2012-04-22T05:45:51.527 に答える