我正在使用以下功能处理Haskell返回类型多态性:
f :: [a] -> [a]
f [] = mempty
f (x:xs) = [x] <> f xs
显然它什么也没做。我想做的就是修改类型,以便它接受列表并返回Monoid容器,其中一个可以是列表。我被困在这里是因为Monoid
接受一种类型的参数。我不知道类型是什么:f :: Monoid m => [a] -> ?
这可能吗?
如您所述,如果没有可用的类型函数,就不能将任意对象a
转换为任何特定Monoid的成员。但是没有适用于所有 Monoid实例的函数-如果存在,则必须在typeclass定义中,并且您可以看到它不存在。m
a -> m
因此,您必须f
像在此为[a]
Monoid 那样专门研究特定的Monoid。否则a -> m
,除了接受转换功能[a]
。也就是说,您的类型可能变为:
combine :: Monoid m => (a -> m) -> [a] -> m
如果我们向Hoogle询问此类型,我们会看到您的函数已经定义(将列表概括为Foldable):
foldMap :: (Foldable t, Monoid m) => (a -> m) -> t a -> m
您可能会发现foldMap
,对于一般的可折叠对象还是专门针对列表的可折叠对象,实现它都是一种有用的练习。