2012-04-21 45 views
8

標準輸出,我有這樣一個簡單的函數:輸出整型在Haskell

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 s工作。

+2

單行:'main = print。 nth。閱讀=「getLine' – JJJ 2012-04-22 06:40:38

回答

12

nth是一個函數,而不是一個IO動作:

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

酷!但是,爲什麼這樣呢? – 2012-04-22 00:15:27

+0

因爲它沒有做任何I/O ...? – 2012-04-22 00:46:25

+1

語法和綁定('x < - action')僅用於Monads。如果你是初學者,那麼你使用的唯一monad就是'IO'。如果你的函數不是'func :: a - > IO b'或者甚至只是'func :: IO b'的形式,那麼你不能使用bind,但是你可以使用let語句。 – 2012-04-22 01:02:43

4

do語法解開一個單子之內的東西。箭頭右側的所有東西都必須存在於IO monad中,否則類型不檢查。在你的程序中,IO Integer會很好。 do是這將寫入如下的更加明確的功能語法糖:

回想(>>=) :: m a -> (a -> m b) -> m b

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

nth不是一元價值,所以它沒有任何意義應用功能(>>=) ,這需要類型IO a

+0

謝謝,現在我很喜歡「哦,所以從這裏來,期待'm0 a0'我正在接受......」 – 2012-04-22 07:20:25

+1

爲了澄清一點,'m0'來自這樣的事實:'(>> =):: Monad m => ma - >(a - > mb) - > mb'。它適用於任何monad,不僅是'IO',在你的情況下,編譯器沒有機會找出'm'是'IO',所以它會在錯誤信息中加入'm0'。 – nponeccop 2012-04-22 10:49:46