2013-03-02 32 views
6

Tôi đã một biến nhưNhóm phù hợp trong trường hợp biểu hiện

a = 3 

Đối với một số giá trị của một, tôi có chức năng tương tự tôi muốn gọi:

case a of 
    3 -> print "hello" 
    4 -> print "hello" 
    5 -> print "hello" 
    6 -> print "hello something else" 

Vì vậy, cho a = 3, một = 4 và a = 5 Tôi thực hiện cuộc gọi hàm giống nhau. Tôi có thể nhóm những thứ này tốt hơn không? Tôi đang tìm kiếm một giải pháp có thể là:

case a of 
    3 || 4 || 5 -> print "hello" 
    6   -> print "hello something else" 

Điều này không có tác dụng, nhưng hy vọng bạn sẽ đến nơi tôi muốn kết thúc.

Cảm ơn.

+0

Sẽ là một tính năng tuyệt vời nếu Haskell cho phép những gì bạn đề xuất. – augustss

Trả lời

13

Làm thế nào về

case a of 
    _ | a == 3 || a == 4 || a == 5 
     -> print "hello" 
    6 -> print "hello something else" 

Ít tẻ nhạt để viết sẽ

case a of 
    _ | a `elem` [3, 4, 5] 
     -> print "hello" 
    6 -> print "hello something else" 

hoặc

case a of 
    _ | 3 <= a && a <= 5 
     -> print "hello" 
    6 -> print "hello something else" 

hoặc thậm chí, nếu trong chương trình thực sự của bạn đã có rất nhiều các giá trị có thể cho bạn phải đối sánh với, như sau:

import qualified Data.Set as S 

valuesToMatchAgainst :: S.Set Int 
valuesToMatchAgainst = S.fromList [3, 4, 5] 

-- ... 

    case a of 
     _ | a `S.elem` valuesToMatchAgainst 
      -> print "hello" 
     6 -> print "hello something else" 

(tôi giả sử bạn hiểu đã _ đó là một ký tự đại diện phù hợp với bất kỳ giá trị, và rằng | introduces a guard.)

+0

Gọn gàng! Tôi đã từng nhìn thấy các lính canh trên LHS của một định nghĩa chức năng - không biết bạn có thể làm điều đó trong bất kỳ trận đấu mẫu nào. –

2

Bạn có thể làm những việc khác nhau để cải thiện mã của bạn. Trước tiên, nếu tất cả các chi nhánh gọi cùng một chức năng thì tại sao không:

print (case a of 
     3 -> "hello" 
     4 -> "hello" 
     5 -> "hello" 
     6 -> "hello something else") 

Yếu tố này làm nổi bật hành vi chung của mã của bạn. Thứ hai, bạn dường như để hỏi về nhóm các trường hợp 3,4 và 5 với nhau, cách tốt nhất có thể là yếu tố ra một chức năng phân loại:

let cat 3 = True 
    cat 4 = True 
    cat 5 = True 
    cat 6 = False 
in print (case cat a of True -> "hello" 
         False -> "hello something else") 

Bạn có thể kết hợp này với một trong những lựa chọn thay thế được đề xuất bởi người đăng trước đó (cat x = x elem [3,4,5] v.v.).

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