tôi có ba chức năng mà tìm ra nguyên tố thứ n của một danh sách:Guards vs if-then-else vs trường hợp trong Haskell
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à việc thực hiện tốt nhất bởi vì nó được ngắn gọn nhất. Nhưng có bất kỳ điều gì về hai cách triển khai khác sẽ khiến chúng trở nên thích hợp hơn không? Và bằng cách mở rộng, làm thế nào bạn sẽ lựa chọn giữa sử dụng bảo vệ, nếu-sau đó khác báo cáo, và các trường hợp?
bạn có thể thu gọn câu lệnh 'case' lồng nhau nếu bạn sử dụng' case so sánh 0 của LT -> ... | EQ -> ... | GT -> ... ' – rampion
@ rampion: bạn có nghĩa là 'trường hợp so sánh 1 của ...' – newacct