Haskell 如何在读取时忽略变形可读类型?

Haskell 如何在读取时忽略变形可读类型?,haskell,Haskell,我有一个类似的问题: data Foo a = Foo { myInt :: Integer, myValue :: a } deriving Read bar :: String -> Integer bar = myInt . read main = print $ bar stringWithFooOfa 我不想使用像read这样的东西。(!!1) . 单词,如果我不需要。添加类型注释到阅读。正如评论者所说,Haskell无法知道你想读什么,因为你会立即将它转换为Int。更清楚

我有一个类似的问题:

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

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

main = print $ bar stringWithFooOfa

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

添加类型注释到
阅读
。正如评论者所说,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

问题是
bar
没有足够的信息来知道如何将字符串读入
fooa
,因为它不知道
a
是什么。在不知道
a
是什么的情况下,它不知道使用
Read
的哪个实例。如果您知道将bar定义为
bar str=(myInt-foo,myValue-foo),其中foo=read-str
,那么它可以很好地编译。不幸的是,您无法创建另一个函数
barInt=fst。条形码,因为它会遇到同样的问题。我建议不要使用这样的函数,尽管它们听起来很方便。您必须明确说明
a
是什么。每个
a
都有一个不同的解析器,如果
a
不可读,那么就没有
Foo
的读取实例。