PureScript 示例(自定义可折叠)

PureScript by example (custom Foldable)

目前我正在阅读 PureScript by example 本书并对其中一个练习有疑问:

第 6 章,本章末尾的练习 5。

Write a Foldable instance for NonEmpty. Hint: resuse the foldable instance for arrays.
data NonEmpty a = NonEmpty a (Array a)

我最初的想法是这样实现的:

instance foldableNonEmpty :: Foldable (Array (a)) => Foldable (NonEmpty a) where
  foldr f b (NonEmpty a ar) = NonEmpty a (foldr f b ar)
  foldl f b (NonEmpty a ar) = NonEmpty a (foldl f b ar)
  foldMap m (NonEmpty a ar) = NonEmpty a (foldMap m ar)

但这行不通,目前我不明白为什么(编译器错误帮不了我)

Could not match kind
  Type -> Type
with kind
  Type

while checking the kind of Foldable (Array a) => Foldable (NonEmpty a)

在值声明中 foldableNonEmpty

谁能指出我应该朝哪个方向挖掘才能找到答案?

错误消息说 Foldable 期望接收类型构造函数 (Type -> Type),但您给它的是具体类型 (Type)。例如:MaybeArray 是类型构造函数; Maybe aArray a 是具体类型。在您的情况下, NonEmpty a 是具体类型。我相信你现在知道如何修复它了。

另外,你的实现也是错误的。 foldr 的类型是

foldr :: forall a b. (a -> b -> b) -> b -> f a -> b

您应该 return 类型为 b 的值,但您正在 return 使用 f a 类型的值,在您的情况下为 NonEmpty a .

我在this link中留下了我的答案,以防你仍然无法理解。