Giả sử tôi có một chức năng thực hiện một số tính toán, với một số mẫu; được thực hiện dưới hình thức khớp mẫu.Haskell có cho phép biểu thức cho phép đối sánh nhiều mẫu không?
Hầu hết các mẫu này (cùng với những thứ khác khác nhau) một cách xử lý thông số, mà tôi sử dụng biến trung gian trong biểu thức let
. Nhưng tôi thấy nó thực sự dư thừa để có cùng một let
trên nhiều mẫu, và tôi tự hỏi nếu có một cách để xác định một let
cho một số mẫu?
Dưới đây là một ví dụ về nhân đôi của tôi let
:
data MyType a = Something a | Another Int [a]
myFunc (Something x) = -- return something, this isn't the point here
myFunc (Another 0 xs) =
let intermediary = some $ treatment xs
in doSthg intermediary 1
myFunc (Another 1 (x:xs)) =
let intermediary = some $ treatment xs
in doSthg1 intermediary 1 x
myFunc (Another 2 (x:x':xs)) =
let intermediary = some $ treatment xs
in doSthg2 intermediary 2 x x'
Bạn có thể thấy rằng các tham số xs
luôn luôn hiện diện khi tôi sử dụng nó cho intermediary
, và điều này có thể được factorised. Nó có thể dễ dàng đạt được bằng cách sử dụng một chức năng trợ giúp nhưng tôi đã tự hỏi nếu những gì tôi yêu cầu là có thể mà không có một. Hãy cố gắng giữ cho nó đơn giản cho người mới bắt đầu, và tôi hy vọng ví dụ của tôi là đủ rõ ràng.
Không! Gotta sử dụng một chức năng riêng biệt và vượt qua nó như là một tham số một cách rõ ràng để yếu tố ra lặp đi lặp lại mã. Theo như Haskell có liên quan, sự xuất hiện ở trên của 'xs' là các biến hoàn toàn khác nhau (vì chúng có các vị trí liên kết khác nhau). – luqui
Cảm ơn! Bây giờ tôi có một câu hỏi khác: bạn có dự định rằng các phương trình thứ ba và thứ tư không bao giờ khớp? Bởi vì 'xs' khớp với bất kỳ danh sách nào ... Bạn đã đảo ngược thứ tự các phương trình? – yatima2975
Tôi đã viết điều này để minh họa rằng 'xs' được trích xuất từ kết hợp mẫu trong nhiều mẫu nhưng không phải lúc nào cũng có cùng ý nghĩa (nếu không khớp mẫu sẽ không quan tâm: chỉ có một mẫu). Những gì được thực hiện với nó trong ví dụ này không quan trọng; nhưng trong mã của tôi 'y' được thay thế bằng các giá trị thực để các mẫu sau đó khớp nhau. Nhưng bạn nói đúng một lần nữa vì vậy tôi sẽ chỉnh sửa nó với một loại cụ thể để làm cho toàn bộ điều dễ hiểu hơn. –