Я пытаюсь понять правила создания монады. Насколько я понимаю, это зависит от типа данных, которые я хочу использовать и что монада должна выполнить три закона:Haskell - создание монады
1. m >>= return = m
2. return x >>= f = f x
3. (m >>= f) >>= g = m >>= (\x-> f x) >>= g
Okay. Итак, для монады Maybe
У меня есть последние 2 строки. Для чего «x
» стоит в третьей строке. Если должна быть функция, не так ли?
data Maybe a = Nothing | Just a
instance Monad Maybe where
(Just x) >>= f = f x
Nothing >>= _ = Nothing
_ >>= x = x
fail _ = Nothing
(я не могу сейчас найти источник этого определения, но я нашел его где-то)
я нашел другую версию, а также - зачем мне нужна строка с «провал»?
data Maybe a = Nothing | Just a
instance Monad Maube where
return x = Just x
Just x >>= f = f x
Nothing >>= f = Nothing
fail _ = Nothing
(источник: http://learnyouahaskell.com/a-fistful-of-monads)
Можете ли вы предоставить источник, из которого вы получили эти определения? –
'_ >> = x = x' просто неправильно. '>> =' имеет тип 'ma -> (a -> mb) -> mb', поэтому это определение игнорирует значение« ma »(которое мы знаем как« Just », но это не имеет значения здесь) и пытается вернуть значение «a -> mb», как если бы оно было «mb». – chepner
Действительно. _Where точно_ вы нашли это определение с '_ >> = x = x'? По крайней мере, это ни в онлайн-версии LYAH, ни в моей печатной версии. И, ну, это не должно быть, неправильно. – leftaroundabout