2016-04-16 3 views
1

Ich hätte gerne eine Liste von Tupeln [(a, b, c) ..] wo a ist String, b und c sind Num. Ich werde eine Funktion haben, möglicherweise Mustervergleich Verständnis, die nur nach dem ersten Element (Unique ID) in einem der Tupel in der Liste suchen und wenn eine Übereinstimmung gefunden wird, wird die Funktion die verbleibenden zwei Elemente im Tupel zurückgeben.Funktion, die erste Element in einer Liste von Tupeln abfragt und die anderen zwei zurückgibt

Ich bin neu im Programmieren und nach vielen Recherchen dachte ich, ich würde mit Haskell anfangen. Ich finde diese http://learnyouahaskell.com sehr nützlich, um damit zu beginnen, aber fest, wie Verständnis und Typ Anmerkungen spielt eine Rolle bei der Mustererkennung. Bis jetzt, was ich im Einklang sehe syntaktisch in Verständnis ist, dass

{ Manipulate Set B, but mind the predicate | Trim it down further to make Set B | Select set A, Predicate } 

ich klingen mag naiv und faul, aber ehrlich gesagt für ein paar schnellen aha Durchbruch suchen, damit ich weitermachen. Danke im Voraus.

+0

Ich könnte falsch sein, weil ich weiß nicht, die vollständige Beschreibung des Problems, aber ich habe das Gefühl, das Sie verwenden die falschen Datenstrukturen hier. 'Data.Map' ist normalerweise eine bessere Wahl für Objekte, auf die eindeutige Schlüssel zeigen. Außerdem sind benutzerdefinierte Datentypen oft eine bessere Wahl als generische Tupel. – jamshidh

Antwort

2

Zunächst ist hier, wie Sie Mustererkennung innerhalb Listenkomprehensionen kann:

[(b,c) | (a,b,c) <- input] 
-- (b,c) constructs your results 
-- (a,b,c) is the pattern matching 

Dann einfach Ihre Prädikat hinzu:

[(b,c) | (a,b,c) <- input, a == id] 

Und da diese IDs eindeutig sind, sind Sie nur interessiert im ersten Spiel, also nur take 1 aus dem obigen Ergebnis.


Ich persönlich mag do Notation besser:

do (a,b,c) <- input 
    guard (a == id) 
    return (b,c) 
+0

Danke! Ich sehe es jetzt wirklich, als du gesagt hast "konstruiere dein Ergebnis" gegen Manipulation. Beide mögen gleich klingen, aber eine ist streng und andere sind locker, wenn es darum geht, wie Sie darüber denken. Ordentlich mit Wächter :) Noch nicht da! –

0
getMtach [] _ = [] 
getMtach ((a, b, c):xs) key 
    | (a == key) = (b, c) : getMtach xs key 
    | otherwise = getMtach xs key 

Main> getMtach [(1, "abc", 12.3), (2, "asg", 4.5), (1, "xyz", 123)] 1 
[("abc",12.3),("xyz",123.0)] 
*Main> 
*Main> getMtach [(1, "abc", 12.3), (2, "asg", 4.5), (1, "xyz", 123)] 2 
[("asg",4.5)] 
Verwandte Themen