присоединяйтесь к разным монадам в Хаскеле - PullRequest
0 голосов
/ 25 сентября 2018

Я знаю, что могу использовать объединение, чтобы удалить первый уровень списка

join [["dog"]] "output ["dog"]

Но почему не работает следующее

join $ (Just ["dog"]) 

got error:
Couldn't match type ‘[]’ with ‘Maybe’

Мы знаем, что Maybe и [] являются монадой в Хаскеле,

join(Monad m)=> m(m a) -> m a

Maybe является монадой

[] является монадой

Что такоечто-то не так?

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

Есть ли какая-либо функция, похожая на объединение для любых монад, таких какпример, который я привел выше?

Я знаю, что могу сделать это следующим образом

fromJust (Just ["dog"]) 

"output:  ["dog"]

Но мне нужно знать только заранее.

1 Ответ

0 голосов
/ 25 сентября 2018

m в join :: Monad m => m (m a) -> m a - это та же самая Монада, где бы она ни появлялась.Если у вас было Just (Just "dog"), то у вас есть две Maybe монады, и ваша join будет отлично работать.Аналогично вашему примеру с списком.

Вытаскивание вещей из Монады не может быть обобщено, что является частью мощи Монад.Учтите, что если бы вы могли сделать это, было бы тривиально лишить безопасность типов Монады ввода-вывода!

Чтобы перейти от Just ["dog"] -> ["dog"], вам просто необходим Maybe a -> a Вы.можно использовать Data.Maybe.fromJust, но maybe безопаснее (что, если вместо этого у вас Nothing)

...