目前我正在阅读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
中有人可以指出我应该在哪个方向找到答案吗?
答案 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
)。例如:Type
和Maybe
是类型构造函数; Array
和Maybe a
是具体类型。在您的情况下,Array a
是具体类型。我相信现在你明白了如何解决它。
此外,您的实施也是错误的。 NonEmpty a
的类型是
foldr
您应该返回类型为foldr :: forall a b. (a -> b -> b) -> b -> f a -> b
的值,但是您返回的值为b
,在您的情况下为f a
。
我在this link留下了答案,以防您仍然无法理解。