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
的读取实例。