繁体   English   中英

PureScript和类型类

[英]PureScript and typeclasses

我在使用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。 我无法弄清楚这一点。

谢谢你的帮助。

实际上,你第一次尝试就差不多了,你在这里遇到的问题是Edge是一个数据构造函数,其中一个字段包含一个对象,而Haskell中的相同语法是定义访问数据中几个字段的函数。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM