2015-03-25 27 views
5

Bir durum ifadesinde birçok farklı kurucularla eşleştirmeye çalışıyorum. Basitlik için, vakaların yarısında, aynı şeyi yaptığımızı ve diğer yarısında da başka bir şey yaptığımızı varsayın. Başka bir işleve mantığı çarpanlarına bile, yine de yazmak zorunda:Kasa deyim kalıpları nasıl birleştirilir

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

durum açıklamaları C gibi daha switch ifadeleri davranmaya yapmak için bir yol (yani fallthrough ile), ya da ben öyle olabilir ki var mıdır Aynı anda birçok desenden birini eşleştirin:

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

Veya bunu temizlemenin başka bir yolu mu?

+0

yaptığım bu benim kullanımı olduğu gibi 'foo' ve' bar' 'bir argüman x'. Aynı zamanda, eşdeğerli kurucuları ortak bir durumda birleştirmek için ayrı bir bölümleme işlevini kullanmanın çirkin fakat doğru cevabını da önler ('C1 -> C1, C2 -> C1, C3 -> C1' gibi ve sonra sadece' C1 'ile eşleşir) . – crockeea

cevap

8

Bunlar ayırma desenleri olarak adlandırılır ve Haskell bunlara sahip değildir. (OCaml ve F # do.) Bununla birlikte, birkaç tipik geçici çözüm vardır. senin tipin bir numaralandırma ise, örneğin elem için birlikte eşitlik kullanabilirsiniz:

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

Ve tabii ki foo veya bar uzun ifadeler ise, teşekkürler sadece yerel tanımları içine faktör olabilir tembellik, bu yüzden hiç sadece adını ve argümanlar olarak gereken herhangi bir desen değişkenleri tekrarlamak zorunda:

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

Çok teşekkür ederim! – bemihai22