В настоящее время я борюсь с новым элементом Haskell: монадами. Поэтому я познакомился с этим на примере создания оператора (>>=)
, который выполняет функцию для типа Maybe
(принимая его фактическое целочисленное значение в качестве аргумента), только если оно не равно Nothing
, и в противном случае возвращает Nothing
:
(>>=) :: Maybe a -> (a -> Maybe b) -> Maybe b
Nothing >>= _ = Nothing
(Just x) >>= f = f x
Однако я не совсем уверен, как это работает при следующем его использовании:
eval (Val n) = Just n
eval (Div x y) = eval x >>= (\n ->
eval y >>= (\m ->
safediv n m))
Мне кажется, что оператор (>>=)
просто принимает одно значение Maybe
и функцию, которая его возвращает, однако в этом примере кода использования кажется, что он принимает 2 раза значение Maybe
и один раз функцию. Однако мне сказали, что он оценивает x
, помещает результат в n
, затем оценивает y
, помещает результат в y
, а затем выполняет функцию safediv
на обоих. Хотя я не понимаю, какую роль здесь играет оператор (>>=)
; Как это работает?