У меня есть эти три функцииЕсть ли предопределенный способ пропустить вычисления, которые приводят к Nothing?
a :: Int -> Maybe Int
a i = if i < 100 then Just i else Nothing
b :: Int -> Maybe Int
b i = if i < 50 then Just i else Nothing
c :: Int -> Maybe Int
c i = if i > 0 then Just i else Nothing
И я хочу, чтобы приковать их вместе, так что, когда результат одной функции приводит в Nothing
вход этой функции вместо него возвращается.
я могу добиться этого с помощью этой функции:
import Data.Maybe (fromMaybe)
e :: Int -> [Int -> Maybe Int] -> Int
e i [] = i
e i (f:fs) = e (fromMaybe i $ f i) fs
-
*Main> e 75 [a,b,c]
75
Есть существующую функцию, экземпляр монады или другим способом в базовых библиотеках, которая демонстрирует такое поведение?
Должно быть ясно, что вы не можете сделать это в целом, так как входные и выходные типы могут отличаться. Вы можете написать функцию типа '(a -> Maybe a) -> a -> a', но не' (a -> Maybe b) -> a -> b' –
Я бы сначала обратил '[Int -> Возможно, Int] 'в' [Int -> Int] 'используя' fromMaybe' так же, как вы. После этого я составил список endos. – chi
'foldr1 (> =>) [a, b, c]' –