2017-05-09 2 views
0

zum Beispiel trennen: Meine Liste von Listen in Haskell ist:Liste von Listen in Haskell - Wie kann ich das erste Element jeder Liste ohne Karte

[[1,2,3], [7,6 , 8], [0,3,4]]

Ich brauche alle ersten Elemente der Liste in der Liste.

Wie kann ich die Ausgabe [1,7,4] ohne "Karte" erhalten? Ich brauche eine Lösung mit Pattern-Matching, das nicht: Liste x = map Kopf x

+0

Tipp: Sie können Nest Muster. Wenn Sie eine Liste von Paaren haben, können Sie 'f ((a, b): xs) = ...' verwenden. Für eine Liste von Listen verwenden Sie ein ähnliches Muster (Sie können '' 'zweimal verwenden). Denken Sie daran, alle möglichen Fälle zu erfassen. – chi

Antwort

2

Blick auf Definitionen von map und head Funktionen. Kopieren Sie dann Implementierungen und kombinieren Sie beide Funktionen in einem. Um es einfacher zu machen, können Sie einfach map kopieren, Funktion ersetzen, übergeben an map mit head und dann verwenden Sie Ihre eigenen head. Sie können den Ausdruck case <expr> of ... verwenden, um Ihren eigenen Kopf nicht als separate Funktion zu implementieren. Nachdem Sie all diese Dinge getan haben, können Sie Ihre Funktion wahrscheinlich umgestalten, um sie eleganter zu machen.

+0

Danke! Ich werde es versuchen! ^^ – programmer

0

Ich bin neu in Haskell, aber das ist es, was ich hier geschafft habe.

Ich verwendete Listenverständnis und Mustervergleich.

--Type definition. Not mandatory but recommended. 
firstItemOfEveryList :: [[a]] -> [a] 
--First pattern. If the list is empty return a empty list. 
firstItemOfEveryList [] = [] 
--Catch all pattern. Receive a list of lists (xxs). For every inner list (xs <- xxs) call the head method (head xs), but only when the inner list is not null or empty (not(null xs). 
firstItemOfEveryList xxs = [head xs | xs <- xxs, not(null xs)] 

Das leere Liste Muster ist ein wenig überflüssig, da es gibt nur das gleiche Ergebnis, dass der letzten Fang. Ich hoffe es hilft.

+0

Das ist sehr gut !!! Ich bin ein Neuling in Haskell. Kannst du mir den Teil "/ = []" erklären Ist das eine Hilfefunktion? Kann ich diesen Kommentar in einer neuen Funktion schreiben? – programmer

+0

Es ist nur eine Bestätigung. Ich überprüfe, ob die aktuelle innere Liste nicht leer ist, weil head einen Fehler wirft, wenn die Liste leer ist. Wenn Sie diese Überprüfung in eine separate Funktion einfügen möchten, können Sie Folgendes tun: 'firstItemOfEveryList xxs = [head xs | xs <- xxs, validateList xs] wobei validateList x = x/= [] ', oder deklariere eine andere Funktion im globalen Gültigkeitsbereich –

+1

Sie sollten keine der _those_ Einschränkungen, nur' Eq a' benötigen. Und wenn Sie 'xs/= []' durch 'not (null xs)' ersetzen, brauchen Sie das auch nicht. –

1
firsts [] = [] 
firsts [(x:xs)] = [x] 
firsts ((x:xs):xss) = x: firsts xss 


> firsts [[1,2,3], [7,6,8], [0,3,4]] 
[1,7,0] 
+0

Gibt es eine Möglichkeit, eine leere Listenvalidierung für die inneren Listen mit Mustern hinzuzufügen? Ich habe es nicht geschafft. –

+1

sollte es fehlschlagen, da es kein erstes Element gibt. Wenn Sie leere Unterlisten ignorieren möchten, können Sie für diese "firsts [[]] = []" Vorkehrungen treffen – karakfa

1

Eine andere Antwort verschachtelte Mustervergleich mit:

firsts :: [[a]] -> [a] 
firsts  []  = [] 
firsts ([]:xss) = error "sublist is empty" 
firsts ((x:xs):xss) = x:firsts xss 
Verwandte Themen