Если вы запустите GHCi и попытаетесь выполнить операцию «обнаженного» деления, вы получите Infinity
:
Prelude> 12 / 0
Infinity
liftM2
, просто позволяющее выполнить операцию внутри контекста monadi c. В случае Just 12
и Just 0
этот контекст равен Maybe
. Это не меняет операции; он имеет дело только с изменчивостью, введенной контейнером.
Prelude Control.Monad> liftM2 (/) (Just 12) (Just 0)
Just Infinity
Prelude Control.Monad> liftM2 (/) (Just 12) Nothing
Nothing
Prelude Control.Monad> liftM2 (/) Nothing (Just 0)
Nothing
Prelude Control.Monad> liftM2 (/) (Just 12) (Just 3)
Just 4.0
Prelude Control.Monad> liftM2 (/) Nothing Nothing
Nothing
Обратите внимание, как liftM2
обрабатывает случаи, когда один или оба аргумента равны Nothing
. Функция, которая принимает два аргумента (например, /
или +
), не может быть вызвана, если у вас нет ровно двух значений. liftM2
обрабатывает случаи, когда у вас меньше двух значений, возвращая Nothing
.
С другой стороны, если существует ровно два значения, он вызывает функцию. Когда вы вызываете его с помощью Just 12
и Just 0
, у вас do есть ровно два значения, и вызывается операция /
, приводящая к Infinity
.
Это, как и ожидалось .