【发布时间】:2014-12-11 18:15:07
【问题描述】:
我遇到了 PureScript 类型类的问题。我必须先声明,我也不是 Haskell 专家,所以如果这些是明显的错误,我深表歉意。
我尝试了几种不同的方法,但每种方法都碰壁了。我基本上是在尝试为图中的一条边定义一个 show 函数。一种方法如下所示:
module Foo where
data Edge n = Edge { from :: n, to :: n }
instance showEdge :: (Show n) => Show (Edge n) where
show e = "Edge from "++(show e.from)++" to "++(show e.to)
e = Edge { from: 1, to: 2 }
main = show e
这给了我错误:
$ psc src/Attempt1.purs
Error at src/Attempt1.purs line 6, column 27:
Error in declaration showEdge
Cannot unify Prim.Object with Foo.Edge.
我猜这与它在show 的定义中推断e 的类型有关。我尝试在此处添加类型注释,但出现语法错误:
module Foo where
data Edge n = Edge { from :: n, to :: n }
instance showEdge :: (Show n) => Show (Edge n) where
show e :: Edge n
show e = "Edge from "++(show e.from)++" to "++(show e.to)
e = Edge { from: 1, to: 2 }
main = show e
我尝试的第二件事是:
module Foo where
type Edge n = { from :: n, to :: n }
instance showEdge :: (Show n) => Show (Edge n) where
show e = "Edge from "++(show e.from)++" to "++(show e.to)
e :: Edge Number
e = { from: 1, to: 2 }
main = show e
这给了我:
$ psc src/Attempt2.purs
Error at src/Attempt2.purs line 5, column 1:
Type synonym instances are disallowed
然后我尝试显式列出底层类型:
module Foo where
type Edge n = { from :: n, to :: n }
instance showEdge :: (Show n) => Show { from :: n, to :: n } where
show e = "Edge from "++(show e.from)++" to "++(show e.to)
e :: Edge Number
e = { from: 1, to: 2 }
main = show e
这给了我:
$ psc src/Attempt3.purs
Error at src/Attempt3.purs line 5, column 1:
Error in type (to :: n, from :: n):
Type class instance head is invalid.
我不知道“类型类实例头”是什么,所以我无处可去。
所有三个尝试都失败了。可能出于完全不同的原因。作为 PureScript 的新手,我只是不知道问题出在哪里。我一直在尝试查看来自各种 Data.* 类型的示例并通过示例阅读 PureScript。我一直无法弄清楚这一点。
感谢您的帮助。
【问题讨论】:
标签: purescript