阅读时如何忽略多态可读类型?

时间:2013-10-20 14:12:34

标签: haskell

我遇到类似的问题:

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

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

main = print $ bar stringWithFooOfa

如果我不需要,我不想使用像read . (!!1) . words这样的东西。

1 个答案:

答案 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