我有以下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类型类的值的函数。类似的东西可能是这样的,或者是否有其他惯用的方法来做这种类型的事情?
答案 0 :(得分:0)
parentNode
函数的类型表示调用者可以选择父类型b
,但我认为这是不正确的。类型应该由DOM中的内容决定,因此您需要一个存在类型。
这里的技术问题是类型类目前无法引用自己。
但是,在这种情况下,我认为有一个更简单的解决方案,它不使用类。为什么不这样呢?
class IsNode a where
toNode :: a -> Node
foreign import data Node :: *
foreign import parentNode :: Node -> Node