我和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.我猜想这与在e的定义中推断show的类型有关。我尝试在这里添加一个类型注释,但是我得到了一个语法错误:
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。我还没搞清楚。
谢谢你的帮助。
发布于 2014-10-17 10:13:03
实际上,在第一次尝试时,您几乎已经做到了,这里的问题是Edge是一个包含一个对象的字段的数据构造函数,而Haskell中相同的语法是定义函数来访问数据中的几个字段。
Haskell没有像PureScript那样像第一类对象那样有对象/记录,所以您所需要做的就是从Edge中打开对象
show (Edge e) = "Edge from " ++ show e.from ++ " to " ++ show e.to
https://stackoverflow.com/questions/26403392
复制相似问题