我遇到类似的问题:
data Foo a = Foo { myInt :: Integer, myValue :: a } deriving Read
bar :: String -> Integer
bar = myInt . read
main = print $ bar stringWithFooOfa
如果我不需要,我不想使用像read . (!!1) . words
这样的东西。
答案 0 :(得分:1)
向read
添加类型注释。正如评论者所说,Haskell无法知道你要读什么,因为你立即把它变成了Int
。为了更清楚,请考虑以下示例:
data Foo a = Foo { myInt :: Integer, myValue :: a } deriving Read
data Foo2 a = Foo { myInt2 :: Integer } deriving Read
bar :: String -> Integer
bar = myInt . read
现在bar
可能存在两种非常不同的行为,而且很难知道哪种行为是正确的。
要告诉Haskell你想要哪一个,请在read
周围使用内联注释:
bar :: String -> Integer
bar = myInt . (read :: String -> Foo ())
请注意,我也选择a
。否则,我们将与上述相同但仅使用a
代替Foo
。