Вызов Map.mapWithKey с функцией ввода, которая возвращает тип Monad - PullRequest
1 голос
/ 29 февраля 2020

У меня есть функция

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])]

Может кто-нибудь помочь руководство мне как это сделать?

1 Ответ

0 голосов
/ 29 февраля 2020

Передайте результаты вашего редуктора через fmap (k ,)

{-# LANGUAGE TupleSections #-}

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

, затем toList даст вам [m (k,[v])].

Затем sequence превратит это в m [(k,[v])], что вы хотели.

...