2015-03-25 14 views
5

Tôi đang cố gắng kết hợp trên nhiều hàm tạo khác nhau trong một câu lệnh case. Để đơn giản, giả sử trong một nửa số trường hợp chúng tôi làm điều tương tự, và trong nửa còn lại, chúng tôi làm điều gì đó khác. Ngay cả khi tôi yếu tố ra logic để chức năng khác, tôi vẫn phải viết:Làm thế nào để kết hợp các mẫu câu lệnh mẫu

case x of 
    C1 -> foo x 
    C2 -> foo x 
    ... 
    C10 -> bar x 
    C11 -> bar x 
    ... 

Có một số cách để làm cho trường hợp báo cáo hành xử như switch báo cáo trong C (tức là với fallthrough), hoặc để tôi có thể phù hợp với một trong nhiều mẫu cùng một lúc, như:

case x of 
    C1, C2, C3 -> foo x 
    C10, C11, C12 -> bar x 

Hoặc có lẽ một cách khác để làm sạch điều này?

+0

Tôi đã tạo 'x' một đối số thành' foo' và 'bar' vì đây là trường hợp sử dụng của tôi. Nó cũng ngăn cản một câu trả lời xấu nhưng đúng khi sử dụng một hàm phân tách riêng biệt để hợp nhất các hàm tạo tương đương vào một trường hợp chung (như C1 -> C1, C2 -> C1, C3 -> C1', và sau đó chỉ khớp trên 'C1') . – crockeea

Trả lời

8

Đây được gọi là các mẫu phân tách và Haskell không có chúng. (OCaml và F # do.) Tuy nhiên, có một vài cách giải quyết điển hình. Nếu loại của bạn là một liệt kê, bạn có thể sử dụng bình đẳng, với ví dụ elem:

case cond of 
    c 
    | c `elem` [C1, C2, C3] -> foo 
    | c `elem` [C10, C11, C12] -> bar 
    | otherwise -> baz 

Và tất nhiên, nếu foo hoặc bar là những biểu hiện dài, nhờ lười biếng bạn chỉ có thể yếu tố chúng vào định nghĩa địa phương, vì vậy bạn chỉ phải lặp lại tên và bất kỳ biến mẫu nào bạn cần làm đối số:

case cond of 
    C1 x -> foo x 
    C2 y -> foo y 
    ... 
    C10 -> bar 
    C11 -> bar 
    ... 
where 
foo x = something long (involving x, presumably) 
bar = if you please then something else quite long 
+0

Cảm ơn bạn rất nhiều! – bemihai22

Các vấn đề liên quan