Ich habe eine dieser drei FunktionenGibt es eine vordefinierte Möglichkeit, Berechnungen zu überspringen, die zu Nichts führen?
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
Und ich möchte, dass sie die Kette zusammen, so dass, wenn das Ergebnis einer Funktion führt zu einer Nothing
die Eingabe dieser Funktion stattdessen zurückgegeben.
Ich kann dies mit dieser Funktion erreichen:
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
Gibt es eine vorhandene Funktion, Monad eine Instanz oder eine andere Art und Weise in den Basisbibliotheken, die dieses Verhalten zeigt?
Es sollte klar sein, dass Sie dies in der Regel nicht tun können, weil die Ein- und Ausgangstypen variieren. Du kannst eine Funktion vom Typ '(a -> Vielleicht a) -> a -> a' schreiben, aber nicht' (a -> Vielleicht b) -> a -> b' –
Ich würde zuerst '[Int -> Vielleicht Int] 'in' [Int -> Int] 'mit' fromMaybe' wie du es getan hast. Danach würde ich die Liste der Endos zusammenstellen. – chi
'foldr1 (> =>) [a, b, c]' –