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
)。例如:Maybe
和 Array
是类型构造函数; Maybe a
和 Array a
是具体类型。在您的情况下, NonEmpty a
是具体类型。我相信你现在知道如何修复它了。
另外,你的实现也是错误的。 foldr
的类型是
foldr :: forall a b. (a -> b -> b) -> b -> f a -> b
您应该 return 类型为 b
的值,但您正在 return 使用 f a
类型的值,在您的情况下为 NonEmpty a
.
我在this link中留下了我的答案,以防你仍然无法理解。
目前我正在阅读 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
)。例如:Maybe
和 Array
是类型构造函数; Maybe a
和 Array a
是具体类型。在您的情况下, NonEmpty a
是具体类型。我相信你现在知道如何修复它了。
另外,你的实现也是错误的。 foldr
的类型是
foldr :: forall a b. (a -> b -> b) -> b -> f a -> b
您应该 return 类型为 b
的值,但您正在 return 使用 f a
类型的值,在您的情况下为 NonEmpty a
.
我在this link中留下了我的答案,以防你仍然无法理解。