Как правило, ожидается, что вы будете использовать подход монади c:
Just 8 >>= \n -> Just 5 >>= \m -> return (n-m)
Однако, не входя в монады, мы все равно можем выполнять эту работу, используя функтор и аппликативные экземпляры типа Maybe
.
Сначала давайте fmap
оператор (-)
над значением Just 8
, например (-) <$> Just 8
. Это приведет к использованию аппликативного типа Maybe
, который равен Just (8-)
с сигнатурой типа Just (8-) :: Num a => Maybe (a -> a)
. Теперь для выполнения задания требуется всего одна аппликативная операция:
λ> (-) <$> (Just 8) <*> (Just 5)
Just 3
Это иногда делается с помощью LiftA2
, как показано в некоторых других ответах, но я думаю, что лучше знать этот шаблон в первую очередь, так как LiftA2
жестко связан с бинарными операторами / функциями, иными словами, если вам нужно поднять троичный оператор, такой как (,,)
, вам нужно вместо этого использовать LiftA3
. Однако вышеприведенный шаблон просто делает это таким же образом, как
λ> (,,) <$> Just 1 <*> Just 't' <*> Just "yeah"
Just (1,'t',"yeah")