我是Haskell的新手,我对函数类型声明有一点疑问。假设有一堆整数,我们需要将它相加并打印出来。我知道这有效:
main = do
a <- fmap (map read . words) getContents :: IO [Int]
print $ sum a
但a <- fmap (map (read :: Int) . words) getContents
失败。为什么失败了?我们知道getContents
是IO String
,然后words
正在处理String
并将[String]
返回map (read :: Int)
,我认为可能会很好,因为我们宣布它为Int
,但它失败了。
在代码行中使用类型声明是不可能的,或者我以错误的方式使用它。感谢。
答案 0 :(得分:4)
问题是read
没有类型Int
,它的类型为String -> Int
(为了您的目的)。 map
函数仅接受函数作为其第一个参数,并且您试图说read
具有类型Int
,这意味着它不是函数。您也无法将类型Read a => String -> a
强制转换为Int
,因此在这两个问题上都会出错。