3

我有一个类似的问题:

data Foo a = Foo { myInt :: Integer, myValue :: a } deriving Read

bar :: String -> Integer
bar = myInt . read

main = print $ bar stringWithFooOfa

我不想使用类似的东西read . (!!1) . words,如果我不需要的话。

4

1 回答 1

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

于 2013-10-20T16:36:25.683 回答