2013-03-10 11 views
6

Jedynym wprowadzanym parametrem jest numer klasy, który otrzymasz. To jest to, co do tej pory miałem.Poprawna składnia instrukcji if w Haskell

myScore x = if x > 90 
    then let x = "You got a A" 
if 80<x<90 
    then let x = "you got a B" 
if 70<x<80 
    then let x = "You got a C" 
if 60<x<90 
    then let x = "you got a D" 
else let x = "You got a F" 

To daje mi błąd „Błąd składniowy na wejściu jeśli`””, próbowałem też:

myScore x = (if x > 90 then "You got an A" | if 80 < x < 90 then "You got a B" | if 70 < x < 80 then "You got a D" | if 60 < x < 70 then "You got a D" else "You got a F") 

ale to nie działało.

+1

Trzeba dodać 'else' przed każdym' if'. –

+2

Byłoby lepiej użyć tutaj strażników zamiast zagnieżdżonych 'if's. – hammar

Odpowiedz

7

Oprócz odpowiedzi Code-Guru, nie można mieć let wewnątrz warunkowych, w przeciwnym razie zmienna x nie będzie dostępna w następującym wyrażeniu, które jej potrzebuje.

W twoim przypadku, nie trzeba nawet let wiążące, ponieważ po prostu chcesz, aby natychmiast powrócić ciąg, więc można po prostu zrobić:

myScore x = 
    if x > 90 then "You got a A" 
    else if 80 < x && x < 90 then "you got a B" 
    else if 70 < x && x < 80 then "You got a C" 
    else if 60 < x && x < 70 then "you got a D" 
    else "You got a F" 

Należy również pamiętać, że nie można zrobić 80<x<90 - musisz połączyć dwa wyrażenia z boolowskim AND.

Wyżej można dodatkowo uproszczone składniowo, wykorzystujące strażników:

myScore x 
    | x > 90 = "You got a A" 
    | x > 80 = "you got a B" 
    | x > 70 = "You got a C" 
    | x > 60 = "you got a D" 
    | othwerwise = "You got a F" 
+2

To wygląda na zadanie domowe, więc nie jest dobrym pomysłem oddanie kompletnego rozwiązania. – amindfv

+1

Nie myślałem o tym ... OP powinien naprawdę stwierdzić, że prawdopodobnie. –

1

Musisz dodać else przed każdym if. Przypomnijmy, że w Haskell każde wyrażenie musi być wartościowane. Oznacza to, że zawsze instrukcja if musi mieć pasującą klauzulę then i pasującą klauzulę else. Twój kod ma tylko jeden numer else z czterema if s. Kompilator uskarża się na brakujące numery else. Kiedy to naprawisz, twój kod Haskella będzie wyglądał podobnie do łańcucha if...else if...else z innych języków programowania.

1

Definiowanie x nie zdefiniuje ją z jej zakresem leksykalnym - w tym przypadku x nie będą dostępne do niczego. Zamiast nich skorzystaj ze składni

let x = 
     if 5 < 4 
     then "Hmm" 
     else "Better" 
in "Here's what x is: " ++ x 

Ponadto, przy wszystkich tych if s nie jest najlepszym sposobem, w Haskell. Zamiast tego można użyć składni Strażnik:

insideText x 
    | elem x [2,3,7] = "Best" 
    | elem x [8,9,0] = "Better" 
    | otherwise  = "Ok." 
1

pod względem kompletności, tutaj składnia straż sugeruje @hammar:

myScore x 
    | x > 90 = "A" 
    | x > 80 = "B" 
    | x > 70 = "C" 
    | x > 60 = "D" 
    | otherwise = "F" 

(Jak o "E"?)

pamiętać, że nie jest konieczne sprawdzanie tutaj x > 80 && x < 90, ponieważ po przejściu pierwszego strażnika musi to być x <= 90. I tak dla wszystkich następujących strażników: wszyscy poprzedni strażnicy mają gwarancję, że będą fałszywi, gdy tylko strażnik zostanie wypróbowany.

koryguje to również błąd logiczny na zdobycie gola literę 'F' jeśli x == 90.

+0

Skoro pytasz "Co powiesz na" E "?: [W USA] (http: //en.wikipedia.org/wiki/Academic_grading_in_the_United_States) (i ewentualnie gdzie indziej, ale mogę mówić tylko do USA), kanoniczny zestaw ocen akademickich to A, B, C, D i F; F jest jedyną wadliwą oceną. (Możesz także uzyskać A + lub A-, B ±, C ± lub D ±, ale nie F ±.) Czasami E jest używane zamiast F, ponieważ E jest następne; ale F jest tradycyjne i używane, ponieważ oznacza "niepowodzenie". (Przynajmniej zakładam, że to dlatego używają F.) –