2011-11-19 12 views

Odpowiedz

11

Wystarczy

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

Uzupełnienie: nawet lepiej, przyszłość impregnowane za pomocą pustego rekordu wzorca (sława hammar):

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

Uwaga jednak, że to działa tylko na zewnątrz tak zgrabnie dla pasujących konstruktorów. Dla właściwości ogólnych, find jest ładniejszy:

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

To miło, dziękuję! – martingw

+0

Bardzo podoba mi się, w jaki sposób to rozwiązanie wykorzystuje zrozumienie list do obejścia, które wymaga dopasowania wzoru na więcej niż tylko pożądany konstruktor danych. Można go poprawić przy użyciu pustego wzorca rekordu używanego przez @hammar w jego odpowiedzi. –

+0

@ IonuţG.Stan zgodził się, że będzie to bezpieczne w przyszłości. –

3

Można użyć znaleźć:

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

Dzięki, bardzo miło! Nie golfisty, choć :-)! – martingw

11

Można użyć Data.List.find.

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

Jak nazywa się część '{}'? Nigdy wcześniej tego nie widziałem w Haskell. Chyba pasuje 0 lub wiele pól konstruktora danych? –

+2

@ IonuţG.Stan: Jest to wzór _record_ bez powiązań pól. Oznacza to tylko, że nie ma znaczenia, ile pól ma konstruktor, więc jeśli go zmienisz, nie musisz zmieniać tej funkcji. – hammar

+0

@hammer Dzięki! Dokładnie to, co myślałem, że to było. –

Powiązane problemy