Saya memiliki tiga fungsi yang menemukan elemen ke-n dari sebuah daftar:
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)
Menurut saya, fungsi pertama adalah implementasi terbaik karena paling ringkas. Tetapi apakah ada sesuatu tentang dua implementasi lainnya yang akan membuatnya lebih disukai? Dan selanjutnya, bagaimana Anda akan memilih antara menggunakan penjaga, pernyataan if-then-else, dan kasus?
case compare a 1 of ...
case
pernyataan bertingkat Anda jika Anda menggunakancase compare a 0 of LT -> ... | EQ -> ... | GT -> ...