2011-11-19 4 views

答えて

11

単に

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

補遺:より良い、将来防音空のレコードパターンを使って(名声のHAMMAR):しかし

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

注、これが唯一のようにきれいに出て働くことコンストラクタをマッチングする。一般的な性質のために、findはよりよいです:

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

これは素晴らしいものです。ありがとうございます! – martingw

+0

私は本当にこのソリューションがどのようにリストの理解を使用して、単に目的のデータコンストラクタ以上のパターンマッチングが必要な回避策が好きです。 @hammarで使用されている空のレコードパターンを使って改善することができます。 –

+0

@IonuţG.Stanは将来合意したと同意した。 –

3

あなたが見つけるを使用することができます。

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

ありがとう、とても素敵!しかし、ゴルフチャンピオンではありません:-)! – martingw

11

あなたはData.List.findを使用することができます。

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

'{} '部分は何と呼ばれていますか?私はハスケルでこれまで見たことがありません。私は0または多くのデータコンストラクタフィールドに一致すると思いますか? –

+2

@IonuţG.Stan:フィールドバインディングのない_recordパターンです。つまり、コンストラクタのフィールド数に関係なく、この関数を変更するだけで、この関数を変更する必要はありません。 – hammar

+0

@hammerありがとう!まさにそれが私が思っていたもの。 –