Чтобы преодолеть вашу конкретную проблему, вы должны попробовать сопоставление с шаблоном по результату f x
.
(>>=) (A x mx) f =
case f x of
A y my ->
B y ->
None ->
Теперь у вас, возможно, проблема большего размера, чем та, с которой вы пришли.Сейчас слишком много вариантов, в отличие от их бедности.В случае A y my
вы должны каким-то образом объединить y
, my
и mx
в конечный результат.Весьма вероятно, что большинство ваших способов нарушит законы.
В этом случае сложно понять, что делать.Мне трудно реализовать монаду, если я не понимаю, что означает типа данных.Я могу «визуализировать» список как монаду, потому что join
(он же (>>= id)
) - это просто конкатенация
join :: [[a]] -> [a]
join [ [ x, y ], [z], [], [w, q] ] = [x, y, z, w, q]
Но для произвольного алгебраического типа данных не существует четкого пути.Откуда появился этот тип данных?- что вы хотите от своего монадного экземпляра?