2013-03-10 18 views
6

L'unico input necessario è il numero del grado che si ottiene. Questo è quello che ho finora.Sintassi corretta per le istruzioni if ​​in 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" 

Questo mi dà un errore "errore di analisi su input` se'", ho anche provato:

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") 

, ma che non ha funzionato neanche.

+1

È necessario aggiungere 'else' prima di ogni' if'. –

+2

Sarebbe meglio usare guardie qui invece di 'if' nidificate. – hammar

risposta

7

In aggiunta alla risposta di Code-Guru, non è possibile avere il let all'interno delle condizioni, altrimenti la variabile x non sarà disponibile nell'espressione seguente che ne ha bisogno.

Nel tuo caso, non è nemmeno necessario il lascia-binding perché si desidera solo per restituire immediatamente la stringa, quindi si può solo fare:

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" 

Si noti inoltre, non si può fare 80<x<90 - Devi combinare due espressioni con un AND booleano.

quanto sopra può essere ulteriormente semplificata sintatticamente, utilizzando guardie:

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

Questo sembra un problema di compiti a casa quindi non è una buona idea dare una soluzione completa. – amindfv

+1

Non ci ho pensato .. OP lo dovrei davvero affermare. –

1

È necessario aggiungere else prima di ogni if. Ricorda che in Haskell, ogni espressione deve valutare un valore. Ciò significa che sempre l'istruzione if deve avere una clausola then corrispondente e una clausola else corrispondente. Il tuo codice ha solo uno else con quattro if s. Il compilatore si lamenta a causa della mancanza di else s. Quando lo aggiusti, il tuo codice Haskell apparirà molto simile a una catena if...else if...else da altri linguaggi di programmazione.

1

Definizione x non definirà fuori del suo ambito lessicale - in questo caso, x non saranno accessibili a qualsiasi cosa. Invece, utilizzare la sintassi

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

Inoltre, utilizzando tutte quelle if s non è il modo migliore in Haskell. Invece, è possibile utilizzare la sintassi di guardia:

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

Per completezza, ecco la sintassi guardia suggerita da @hammar:

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

(Che ne dite di "E"?)

Si noti che non è necessario per controllare x > 80 && x < 90 qui, perché quando passa la prima guardia, deve essere quello x <= 90. E così per tutte le seguenti guardie: tutte le guardie precedenti sono garantite come false, ogni volta che una guardia viene processata.

corregge questo anche l'errore logico di segnare una 'F' se x == 90.

+0

Dato che chiedi "Che ne dici di" E "?": [Negli Stati Uniti] (http: //en.wikipedia.org/wiki/Academic_grading_in_the_United_States) (e possibilmente altrove, ma posso parlare solo con gli Stati Uniti), l'insieme canonico dei gradi accademici è A, B, C, D e F; F è l'unico voto negativo. (Puoi anche ottenere un A + o A-, B ±, C ± o D ±, ma non un F ±.) A volte E viene usato al posto di F, poiché E viene dopo; ma F è tradizionale, e usato dal momento che significa "fallire". (O almeno, suppongo sia per questo che usano F.) –