Tôi có ba hàm tìm phần tử thứ n của danh sách:
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)
Theo tôi, chức năng đầu tiên là thực hiện tốt nhất vì nó ngắn gọn nhất. Nhưng có điều gì về hai cách triển khai kia khiến chúng trở nên thích hợp hơn không? Và mở rộng, bạn sẽ chọn như thế nào giữa việc sử dụng bảo vệ, câu lệnh if-then-else và các trường hợp?
case compare a 1 of ...
case
câu lệnh lồng vào nhau của mình nếu bạn đã sử dụngcase compare a 0 of LT -> ... | EQ -> ... | GT -> ...