首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PureScript与类型化

PureScript与类型化
EN

Stack Overflow用户
提问于 2014-10-16 11:35:33
回答 1查看 1.3K关注 0票数 7

我和PureScript打字员有问题。我不得不说,坦白说,我也不是Haskell专家,所以如果这些都是明显的错误,我很抱歉。

我试过几种不同的方法,每种方法都碰到了一堵墙。我基本上是想为图中的一个边定义一个show函数。一种方法如下:

代码语言:javascript
复制
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

这给了我一个错误:

代码语言:javascript
复制
$ 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的类型有关。我尝试在这里添加一个类型注释,但是我得到了一个语法错误:

代码语言:javascript
复制
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

我试过的第二件事是:

代码语言:javascript
复制
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

这给了我:

代码语言:javascript
复制
$ psc src/Attempt2.purs
Error at src/Attempt2.purs line 5, column 1:
Type synonym instances are disallowed

于是,我尝试显式地列出底层类型:

代码语言:javascript
复制
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

这给了我:

代码语言:javascript
复制
$ 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。我还没搞清楚。

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-17 10:13:03

实际上,在第一次尝试时,您几乎已经做到了,这里的问题是Edge是一个包含一个对象的字段的数据构造函数,而Haskell中相同的语法是定义函数来访问数据中的几个字段。

Haskell没有像PureScript那样像第一类对象那样有对象/记录,所以您所需要做的就是从Edge中打开对象

show (Edge e) = "Edge from " ++ show e.from ++ " to " ++ show e.to

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26403392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档