【发布时间】:2012-11-25 01:37:07
【问题描述】:
当我遇到困难时,我才刚刚开始玩 Haskell。
我正在尝试创建Read 类的新数据类型(我们称之为MyType)实例。 Mytype 是一个类型构造函数,所以它接受另一个类型作为参数。我想写这样的代码
instance (Read a) => Read (MyType a) where
readsPrec _ r = [foo (read r :: a ), r]
但它给了我以下错误
Could not deduce (Read a2) arising from a use of `read' from the context (Read a).
我认为既然 a 是 Readable 我可以推断它,但显然我错了。有什么想法吗?
编辑: 我把之前的代码改成了
readsPrec _ r = [foo (read r :: a ), ""]
所以如果我输入:read "myString" :: MyType a,它就可以正常工作。
现在我希望如果我在上下文中使用read "myString",我不应该指定要读取的类型。但问题在于
bar (read myString) a
bar:: MyType a -> a -> MyType a,我得到了
歧义变量类型。
有没有可能做这样的事情而不会出现这种错误?
我希望现在更清楚了,我正在尝试简化代码,但我希望我没有遗漏任何重要的内容。
【问题讨论】:
-
请在此处给出 foo 的类型,只是为了完整。
-
foo,它实际上是一个解析器,在我试图在这里简化的代码中它有点复杂。现在即使没有 ScopedTypeVariables 它实际上也可以编译,但正如你在另一篇文章中所说,我可能误解了 readPresc 的工作方式,因为现在我得到了 Exception: Prelude.read: no parse When I try to read a string as MyType.
-
好的,所以在我的情况下正确应该是 [foo (read r :: a ), ""],希望对其他一些新手有帮助:)
-
抱歉,我发现您的编辑令人困惑。你能把它改成一个问题吗?
-
我改写一下,我希望现在更清楚:)