我有一个类似的问题:
data Foo a = Foo { myInt :: Integer, myValue :: a } deriving Read
bar :: String -> Integer
bar = myInt . read
main = print $ bar stringWithFooOfa
我不想使用类似的东西read . (!!1) . words
,如果我不需要的话。
我有一个类似的问题:
data Foo a = Foo { myInt :: Integer, myValue :: a } deriving Read
bar :: String -> Integer
bar = myInt . read
main = print $ bar stringWithFooOfa
我不想使用类似的东西read . (!!1) . words
,如果我不需要的话。
添加类型注释到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
。