Ich habe drei Funktionen, die das n-te Element einer Liste finden:
nthElement :: [a] -> Int -> Maybe a
nthElement [] a = Nothing
nthElement (x:xs) a | a <= 0 = Nothing
| a == 1 = Just x
| a > 1 = nthElement xs (a-1)
nthElementIf :: [a] -> Int -> Maybe a
nthElementIf [] a = Nothing
nthElementIf (x:xs) a = if a <= 1
then if a <= 0
then Nothing
else Just x -- a == 1
else nthElementIf xs (a-1)
nthElementCases :: [a] -> Int -> Maybe a
nthElementCases [] a = Nothing
nthElementCases (x:xs) a = case a <= 0 of
True -> Nothing
False -> case a == 1 of
True -> Just x
False -> nthElementCases xs (a-1)
Meiner Meinung nach ist die erste Funktion die beste Implementierung, weil sie am prägnantesten ist. Aber gibt es irgendetwas an den beiden anderen Implementierungen, das sie vorzuziehen wäre? Und im weiteren Sinne, wie würden Sie zwischen der Verwendung von Wachen, Wenn-Dann-Sonst-Anweisungen und Fällen wählen?
case compare a 1 of ...
case
Anweisungencase compare a 0 of LT -> ... | EQ -> ... | GT -> ...