【问题标题】:PureScript by example (custom Foldable)PureScript 示例(自定义可折叠)
【发布时间】:2018-02-23 00:27:38
【问题描述】:

目前我正在阅读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 is defined for Array是怎么做到的。您发现与您的定义有什么不同吗?
  • 谢谢你的这个建议,之前对我没有帮助,但是在 wuct 的解释下我发现它很有用

标签: functional-programming purescript


【解决方案1】:

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

此外,您的实现也是错误的。 foldr 的类型是

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

您应该返回一个类型为 b 的值,但您返回的是一个类型为 f a 的值,在您的情况下为 NonEmpty a

我把我的答案留在this link,以防你仍然无法弄清楚。

【讨论】:

  • 感谢您对编译器错误的解释。只是想确认一下:第一行(Type -> Type)总是编译器想要的,第二行是他真正拥有的?我能够解决这个问题,谢谢你的帮助!需要更多练习...
  • @Alex 你是对的。第一行是编译器想要的。
猜你喜欢
  • 1970-01-01
  • 2016-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多