使用 return Monad 类型的输入函数调用 Map.mapWithKey

Calling Map.mapWithKey with input function that return a Monad type

我有一个功能

type Reducer k v = k -> [v] -> [v]

如果我有一个类型为

的变量 r
Ord k =>  Reducer k v

和来自类型

的变量input
 Ord k =>  Map k [v] 

我可以写出表达式

Map.toList . Map.mapWithKey r input 

并从类型 [(k,[v])]

中获取输出

现在假设我有一个类型为 :

的函数
type ReducerM m k v = k -> [v] -> m [v]

和类型为 :

的变量 rm
(Ord k, Monad m) => ReducerM m k v 

我要应用表达式

Map.toList . Map.mapWithKey rm input  

并取回类型 m [(k,[v])]

有人可以帮助指导我怎么做吗?

通过 fmap (k ,)

传递你的 reducer 结果
{-# LANGUAGE TupleSections #-}

fmap (k ,) (_ :: m [v]) :: m (k,[v])

然后 toList 给你 [m (k,[v])].

然后sequence把它变成你想要的m [(k,[v])]