2011-11-19 17 views

cevap

11

Basitçe

import Data.Maybe (listToMaybe) 
getA xs = listToMaybe [e | [email protected](A _) <- xs] 

Zeyilname: daha da iyisi, gelecek geçirmez boş kayıt kalıbı kullanarak (Şeref hammar): Ancak

getA xs = listToMaybe [e | [email protected](A{}) <- xs] 

Not bu sadece bu yüzden düzgünce dışarı çalışır müteahhitleri eşleştirmek için. Genel özellikleri için find daha güzel:

data Elem = A Int | B Char deriving Show 
getA elements = find (\x->case x of (A _) -> True; _ -> False) elements 
+0

Bu güzel, teşekkürler! – martingw

+0

Bu çözümün, yalnızca istenen veri yapıcısından daha fazla kalıp eşlemesine sahip olan geçici çözüm için liste kavramasını nasıl kullandığını gerçekten seviyorum. Cevabında @hammar tarafından kullanılan boş kayıt deseni kullanılarak geliştirilebilir. –

+0

@ IonuțG.Stan, geleceği kanıtlayacaktı. –

3

seni bulmak kullanabilirsiniz.

getA = find isA 
    where isA (A {}) = True 
     isA _ = False 
+0

Teşekkürler, çok güzel! Golf şampiyonu olmasa da, :-)! – martingw

11

Sen Data.List.find kullanabilirsiniz:

get prop xs = listToMaybe [e | e <- xs, prop e] 
get prop xs = listToMaybe (filter prop xs) 
get prop xs = find prop xs 
+1

"{}" adlı parça nedir? Haskell'de daha önce hiç görmedim. Sanırım 0 veya birçok veri kurucu alanıyla eşleşiyor? –

+2

@ IonuțG.Stan: Alan bağlantıları olmayan bir _record pattern_. Bu, kurucunun kaç tane alanı olduğu önemli değildir, yani eğer değiştirirseniz, bu işlevi değiştirmek zorunda kalmazsınız. – hammar

+0

@hammer Teşekkürler! Tam olarak düşündüğüm şeydi. –

İlgili konular