Cả hai đều chính xác. Có thể cho rằng, cái đầu tiên là Haskell thành ngữ hơn vì nó sử dụng tính năng rất quan trọng của nó được gọi là mẫu phù hợp với. Ở dạng này, nó sẽ thường được viết là:
lucky::(Integral a)=> a-> String
lucky 7 = "LUCKY NUMBER 7"
lucky _ = "Bad luck"
Các gạch nghĩa thực tế là bạn đang bỏ qua các hình thức chính xác (giá trị) của tham số của bạn. Bạn chỉ quan tâm rằng nó khác với 7
, là mẫu được ghi lại bởi tuyên bố trước đó của bạn.
Tầm quan trọng của khớp mẫu được minh họa tốt nhất theo chức năng hoạt động trên dữ liệu phức tạp hơn, chẳng hạn như danh sách. Nếu bạn đã viết một hàm tính toán chiều dài của danh sách, ví dụ, bạn có thể sẽ bắt đầu bằng cách cung cấp một biến thể cho các danh sách rỗng:
len [] = 0
Mệnh []
là một mô hình, được thiết lập để phù hợp với danh mục sản phẩm nào . Danh sách trống rõ ràng có độ dài là 0, vì vậy đó là những gì chúng tôi đang có chức năng của chúng tôi trở lại.
Các phần khác của len
sẽ là như sau:
len (x:xs) = 1 + len xs
Ở đây, bạn đang so khớp trên mô hình (x:xs)
. Colon :
là cái gọi là toán tử số: nó đang thêm một giá trị vào danh sách. Do đó, một biểu thức x:xs
là một mẫu phù hợp với một số phần tử (x
) được thêm vào một số danh sách (xs
). Nói chung, nó khớp với danh sách có ít nhất một phần tử, vì xs
cũng có thể là danh sách trống ([]
).
Định nghĩa thứ hai này là len
cũng khá đơn giản. Bạn tính toán độ dài của danh sách còn lại (len xs
) và ở mức 1, tương ứng với phần tử đầu tiên (x
).
(Cách thông thường để viết định nghĩa trên sẽ là:
len (_:xs) = 1 + len xs
mà một lần nữa thể hiện rằng bạn không quan tâm những gì các yếu tố đầu tiên là, duy nhất mà nó tồn tại).
Theo như tôi biết, chúng giống nhau về ý nghĩa nhưng cái đầu tiên trông đẹp hơn và là cách ưu tiên để thực hiện nó trong Haskell. Tôi sẽ không đăng bài này như là một câu trả lời vì tôi không phải là một Haskell chuyên nghiệp và có thể là sai. – Matej
Nhân tiện, bạn không cần ngoặc đơn: 'lucky2 x = if x == 7 rồi" SỐ LUCKY 7 "khác" Xấu may "' – sdcvvc
Ngoài ra, bạn có thể viết kiểu như «lucky :: Integral -> String' . Các công cụ đặt tên ở bên trái của '=>' chỉ dành cho trường hợp bạn cần cùng một loại hai lần. –