如何表达具有返回相同类型类值的函数的类型类

时间:2017-06-30 12:37:00

标签: typeclass purescript

我有以下purescript代码:

class Node a where
  parentNode :: forall b. (Node b) => a -> b

但是在编译时我得到以下错误:

A cycle appears in the definition of type synonym Node
Cycles are disallowed because they can lead to loops in the type checker.
Consider using a 'newtype' instead.

我正在尝试编写一个返回节点父节点的函数parentNode。父节点的唯一保证是它也是Node b。 我不关心b的实际类型是什么。

我基本上试图说,parentNode应该是一个返回一个也实现Node类型类的值的函数。类似的东西可能是这样的,或者是否有其他惯用的方法来做这种类型的事情?

1 个答案:

答案 0 :(得分:0)

parentNode函数的类型表示调用者可以选择父类型b,但我认为这是不正确的。类型应该由DOM中的内容决定,因此您需要一个存在类型。

这里的技术问题是类型类目前无法引用自己。

但是,在这种情况下,我认为有一个更简单的解决方案,它不使用类。为什么不这样呢?

class IsNode a where
  toNode :: a -> Node

foreign import data Node :: *

foreign import parentNode :: Node -> Node