PureScript示例(自定义可折叠)

时间:2018-02-21 15:58:54

标签: functional-programming purescript

目前我正在阅读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

有人可以指出我应该在哪个方向找到答案吗?

1 个答案:

答案 0 :(得分:2)

错误消息是@Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { converters.add(new MappingJackson2HttpMessageConverter(objectMapper())); } @Bean public ObjectMapper objectMapper() { return Jackson2ObjectMapperBuilder.json().build(); } 期望接收类型构造函数(Foldable),但是您给它一个具体类型(Type -> Type)。例如:TypeMaybe是类型构造函数; ArrayMaybe a是具体类型。在您的情况下,Array a是具体类型。我相信现在你明白了如何解决它。

此外,您的实施也是错误的。 NonEmpty a的类型是

foldr

您应该返回类型为foldr :: forall a b. (a -> b -> b) -> b -> f a -> b 的值,但是您返回的值为b,在您的情况下为f a

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