Есть ли способ записать do
нотацию для монады в функции, возвращаемый тип которой не принадлежит указанной монаде?
У меня есть основная функция, выполняющая большую часть логики кода, дополненная другой функцией, которая выполняет некоторые вычисления для нее посередине. Дополнительная функция может дать сбой, поэтому она возвращает значение Maybe
. Я хочу использовать обозначение do
для возвращаемых значений в основной функции. Приведем общий пример:
-- does some computation to two Ints which might fail
compute :: Int -> Int -> Maybe Int
-- actual logic
main :: Int -> Int -> Int
main x y = do
first <- compute x y
second <- compute (x+2) (y+2)
third <- compute (x+4) (y+4)
-- does some Int calculation to first, second and third
Я намерен сделать так, чтобы first
, second
и third
имели фактические значения Int
, вынутые из контекста Maybe
, но выполнение описанного выше способа заставляет Haskell жаловаться на невозможность сопоставления типов Maybe Int
с Int
.
Есть ли способ сделать это? Или я иду не в том направлении?
Простите меня, если некоторая терминология используется неправильно, я новичок в Haskell и все еще пытаюсь осмыслить все вокруг.
ИЗМЕНИТЬ
main
должен возвращать Int
без упаковки в Maybe
, поскольку есть другая часть кода, использующая результат main
as Int
. Результаты одного compute
могут не сработать, но они должны вместе пройти (т.е. пройти хотя бы один) в main
, и я ищу способ использовать do
нотацию, чтобы вывести их из Maybe
, сделать несколько простых Int
вычисления для них (например, возможно, обработка любого Nothing
, возвращенного как 0
), и возвращение окончательного значения как просто Int
.
Maybe
, а если нет, вы можете использоватьreturn
. - person Willem Van Onsem   schedule 13.10.2018compute
илиmain
? В любом случаеcompute
уже возвращает значениеMaybe
, аmain
должен определенно возвращатьInt
, следовательно,Maybe
не будет. Другими словами, одно из вычислений вmain
может завершиться неудачно, но по крайней мере одно должно пройти, что гарантирует, чтоmain
имеет возвращаемое значениеInt
. - person lookarpthestars   schedule 13.10.2018Monad Maybe
состоит в том, чтобы рассматриватьMaybe
как потенциально неудачные вычисления. Итак, здесь вы составляете цепочку потенциально неудачных вычислений и возвращаетеJust result
в случае успеха иNothing
в противном случае. Если вы уверены, чтоcompute
всегда будет возвращатьJust _
, тогда почему у него есть подписьInt -> Int -> Maybe Int
? - person Willem Van Onsem   schedule 13.10.2018