2017-04-21 4 views
-2

Ich bin ein Anfänger in Haskell. Ich habe eine kleine CSV-Datei geschrieben.So übertragen Sie eine CSV in ein Diagramm

csv = ["a1","b1","c1","d1"] 
     ["a2","b2","c2","d2"] 
     ["a3","b3","c3","d3"] 

möchte ich auf einen Graphen Par übertragen:

graph :: [(Str,Str,Str)] 
graph :: [("a1","b","b1"), 
      ("a1","b","c1") 
      ("a1","b","d1")] 
a::[[str]] -> [String,String,String] 
f csv = ? 
test = a csv == graph 

Können Sie mir erklären, wie es zu tun TKS

+1

Also ... was ist Ihre Frage? Außerdem ist Stackoverflow nicht unbedingt der beste Ort, um deine Hausaufgaben für dich zu erledigen. Wenn Sie über funktionierenden Code verfügen, können Sie den Stackexchange-Code überprüfen und Tipps zur Verbesserung erhalten. Kompiliert dieser Code? Was sind einige Ein- und Ausgänge dafür? Was soll der Output hier sein? Sie haben nicht einmal eine Beschreibung Ihres Problems geliefert. – bheklilr

+0

Ich möchte nur eine Liste zu m Unterliste teilen – Ada

+1

Ich würde Ihnen empfehlen, http://StackOverflow.com/Help/How-to-ask ein lesen, dann kommen Sie zurück und bearbeiten Sie Ihre Frage nach diesen Richtlinien. Sie werden auf dieser Seite eine viel bessere Antwort bekommen, wenn Sie sich etwas Mühe geben. Außerdem kann Ihnen das Schreiben einer guten Frage mit einer Erklärung Ihres Denkprozesses helfen, das Problem besser zu verstehen und Ihnen helfen, selbst zur Lösung zu kommen. Das ist mir in der Vergangenheit schon mehrmals passiert. – bheklilr

Antwort

1

Edit:? Hoppla, ich den Zweck der besonderen verpasst Fall. Die Antwort wurde korrigiert ...

Ihr Programm ist fast korrekt, aber leider wird es keine Überprüfung geben. Wenn Sie GHC verwenden, erhalten Sie einen schrecklichen Fehler wie folgt aus:

Fsplit.hs:5:30: error: 
    • Couldn't match type ‘x’ with ‘[x]’ 
     ‘x’ is a rigid type variable bound by 
     the type signature for: 
      fsplit :: forall x. Eq x => Int -> [x] -> [[x]] 
     at Fsplit.hs:3:11 
     Expected type: [[x]] 
     Actual type: [x] 
    • In the expression: (l) 
     In the expression: 
     if n == 0 then (l) else (take n l) : (fsplit (m - 1) (drop n l)) 
     In an equation for ‘fsplit’: 
      fsplit m l 
      = if n == 0 then (l) else (take n l) : (fsplit (m - 1) (drop n l)) 
      where 
       n = div (length l) m 
    • Relevant bindings include 
     l :: [x] (bound at Fsplit.hs:5:10) 
     fsplit :: Int -> [x] -> [[x]] (bound at Fsplit.hs:4:1) 

Die wichtigen Dinge aus dieser Fehlermeldung zu holen sind:

  1. Der Fehler in Zeile aufgetreten 5, Spalte 30 (die in meiner Quelldatei in die (l) nach dem then Schlüsselwort entspricht)
  2. Haskell erwartet, dass die Art [[x]] aber begegnet den tatsächlichen Typ [x]
  3. Dies geschah, als TRYI ng um den Ausdruck zu geben überprüfen (l)

diese heraus Figuring kann ein wenig schwierig sein, wenn Sie zu Haskell neu sind, aber das Problem ist, dass Sie versuchen, den Sonderfall zu behandeln, in denen die ursprüngliche Liste l ist kürzer als die Größe der Unterliste, indem die ursprüngliche Liste zurückgegeben wird. Der Typ l ist jedoch [x], eine Liste eines Typs x, aber Ihre Funktion gibt einen Wert vom Typ [[x]] zurück, der eine Liste von Listen eines Typs x ist.

Dies ist ein Hinweis, dass in Ihrem Programm ein logischer Fehler aufgetreten ist. In diesem speziellen Fall (l10 zu kurz) möchten Sie nicht wirklich die ursprüngliche Liste l zurückgeben. Stattdessen möchten Sie eine Liste mit Unterlisten zurückgeben, in der die einzige Unterliste die Liste l ist. Das heißt, Sie wollen die Singleton Liste zurückzukehren [l]:

fsplit m l = if (n==0) then [l] else (take n l):(fsplit (m-1)(drop n l)) 
      where n = div (length l) m 

und das sollte funktionieren:

> fsplit 5 [] 
[] 
> fsplit 5 [1..10] 
[[1,2],[3,4],[5,6],[7,8],[9,10]] 
> fsplit 3 [1..10] 
[[1,2,3],[4,5,6],[7,8,9,10]] 
> fsplit 20 [1..10] 
[[1,2,3,4,5,6,7,8,9,10]] 
Verwandte Themen