我一直在尝试使用 rank-2 类型在 PureScript 中对 GADT 进行编码,如此处所述的Haskell
我的代码如下所示:
data Z
data S n
data List a n
= Nil (Z -> n)
| Cons forall m. a (List a m) (S m -> n)
fw :: forall f a. (Functor f) => (forall b . (a -> b) -> f b) -> f a
fw f = f id
bw :: forall f a. (Functor f) => f a -> (forall b . (a -> b) -> f b)
bw x f = map f x
nil :: forall a. List a Z
nil = fw Nil
cons :: forall a n. a -> List a (S n)
cons a as = fw (Cons a as)
instance listFunctor :: Functor (List a) where
map f (Nil k) = Nil (f <<< k)
map f (Cons x xs k) = Cons x xs (f <<< k)
编译器抱怨Wrong number of arguments to constructor Main.Cons
,指的是 Functor 实例中的 LHS 模式匹配。
这里出了什么问题?
问候,
迈克尔