Преобразование функции, которая выводит тип Monad, в функцию, которая выводит тип необработанного значения - PullRequest
1 голос
/ 29 февраля 2020

У меня есть 2 определения типа

type Mapper a k v = a -> [(k,v)]
type MapperM m a k v = a -> m [(k,v)]

Я хочу написать функцию, которая преобразует значение из типа

(Ord k, Monad m) => MapperM m a k v

в тип

Ord k => Mapper a k v 

в основном функция, которая принимает a -> m [(k, v)] в качестве аргумента и возвращает a -> [(k, v)] в качестве вывода.

Все мои попытки проваливаются с проверками типа Haskell.

1 Ответ

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

Я полагаю, что это математически невозможно.

Рассмотрим случай, когда m - это может быть: функция может возвратить [(k, v)] из Just [(k, v)], но что она вернет? from Nothing?

Если монадой является IO, извлечение аргумента из монады нарушит безопасность, которую обеспечивает IO.

Также учтите, что ваша функция должна работать для любой мыслимой монады.

...