2013-04-01 4 views
10

ich versuchte, 3-4 zu schreiben, wo Anweisung in einer einer Funktion, aber ich bekomme Fehler und konnte sie nicht tun, habe ich versucht, so etwas zu tun:ist es eine Möglichkeit, für mehr where-Anweisung in Haskell

foo x= 
| x == foo1 = 5 
| x == foo2 =3 
| x == foo3 =1 
| otherwise =2 
where foo1= samplefunct1 x 
     foo2= samplefunct2 x 
     foo3= samplefunct3 x 

Ich weiß, dass der Code ein wenig nutzlos ist, aber ich habe das nur geschrieben, um ein Beispiel zu geben, was ich meine.

Gibt es jemanden, der mir helfen kann? Danke im Voraus.

+2

Es sollte kein '=' nach 'foo x' geben. – gspr

+0

@gspr yea Sie tut mir leid, aber, ich denke, es war nicht die eigentliche Frage. –

+5

Außerdem schlage ich vor, dass Sie in der Zukunft alle Fehler, die Sie erhalten, einschließen. Den Leuten einfach zu sagen, dass Sie einen Fehler bekommen, ist nicht konstruktiv. – gspr

Antwort

18

Entfernen Sie die = nach foo x und Code einrücken wie

foo x 
    | x == foo1 = 5 
    | x == foo2 =3 
    | x == foo3 =1 
    | otherwise =2 
    where foo1 = samplefunct1 x 
      foo2 = samplefunct2 x 
      foo3 = samplefunct3 x 

und du bist in Ordnung.

+0

wenn ich some schrieb, wie ich eine Fehlermeldung, "Syntaxfehler in Eingang (unerwartet' = ') " get my wo Anweisungsteil ist \t | sonst = (-1, -1) \t wo rightk = rightCheck Bereich Nummer leftk = leftCheck Bereich Nummer und wenn ich eine der WHERE-Anweisungen lösche, wird es korrekt ausgeführt. –

+0

Sind Sie sicher, dass Ihre Whitespaces korrekt sind? Es ist schwer zu sagen, was du mit Code "wie" meinst. Was ich eingefügt habe, hat keine Syntaxfehler. – gspr

+0

Ah, in diesem Fall scheint es, dass Ihr Code sehr verschieden von dem sein könnte, was Sie oben eingefügt haben. Einschließlich des tatsächlichen Codes könnte helfen. – gspr

8

Dieser Code ist fast richtig, Sie brauchen nur den richtigen Einzug: Whitespace ist wichtig in haskell. Außerdem ist das Verwenden eines = nach foo ein Fehler mit Wachen, also müssen Sie das auch entfernen. Das Ergebnis ist:

foo x 
    | x == foo1 = 5 
    | x == foo2 =3 
    | x == foo3 =1 
    | otherwise =2 
    where foo1= whatever1 x 
     foo2= whatever2 x 
     foo3= whatever3 x 
+0

danke, aber ich möchte 3 verschiedene Funktionen in jeder where-Anweisung verwenden.Wie Sie aus meinem Code sehen können, die erste, wo mit samplefunc1 läuft und die zweite mit sampelfunct2 läuft und so weiter, sind Sie sicher, es ist okey damit? –

+1

ja, ich habe nur 'id' verwendet, also kompiliert, es ist egal, was du da steckst – jozefg

+0

Ich habe es bearbeitet, um es klarer zu machen – jozefg

7

Wenn Ihre Einbuchtung etwas uneben ist, wie folgt aus:

foo x 
| x == foo1 = 5 
| x == foo2 =3 
| x == foo3 =1 
| otherwise =2 
where foo1= samplefunct1 x 
     foo2= samplefunct2 x 
     foo3= samplefunct3 x 

zwar dann, um die Fehlermeldung Gespräche unerwartete = (und in der Zukunft, nicht fügen Sie bitte voll Fehlermeldung im Fragetext).

Sie beheben diesen Fehler durch erneutes Ausrichten oder mit { ; }:

foo x 
| x == foo1 = 5 
| x == foo2 =3 
| x == foo3 =1 
| otherwise =2 
where { foo1= samplefunct1 x ; 
     foo2= samplefunct2 x ; 
      foo3= samplefunct3 x } 

läuft gut (nicht, dass es eine schöne Art zu verwenden ist). Manchmal sieht es sogar für Sie selbst aus, ist es aber nicht, wenn es Tabulatorzeichen versteckt im White-Space gibt.

Verwandte Themen