De enige ingang die u nodig hebt is het cijfer getal dat je krijgt. Dit is wat ik tot nu toe.
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"
Dit geeft me een fout “parse fout op ingang ‘if'”, heb ik ook geprobeerd:
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")
, maar dat ook niet werkte.
Antwoord 1, Autoriteit 100%
U kunt niet de let
in het conditionele, anders wordt de variabele x
zal niet beschikbaar zijn in de volgende uitdrukking die het nodig heeft.
In uw geval, je hoeft niet eens de-let bindend omdat je gewoon wilt de string onmiddellijk terug te keren, zodat je gewoon kunt doen nodig:
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"
Ook de notitie kunt u niet doen 80<x<90
– je moet twee uitdrukkingen te combineren met de &&
operator ..
De bovenstaande syntactisch kan verder worden vereenvoudigd, gebruik maken van bewakers:
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"
| otherwise = "You got a F"
Antwoord 2, autoriteit 24%
Je moet else
toevoegen voor elke if
. Bedenk dat in Haskell elke expressie een waarde moet opleveren. Dit betekent dat elke if
-expressie een overeenkomende then
-clausule en een overeenkomende else
-clausule moet hebben. Je code heeft slechts één else
met vier if
en. De compiler klaagt vanwege de ontbrekende else
s. Als je het repareert, zal je Haskell-code veel lijken op een if...else if...else
-keten uit andere programmeertalen.
Antwoord 3, autoriteit 10%
Het definiëren van x
definieert het niet buiten zijn lexicale bereik — in dit geval zal x
voor niets toegankelijk zijn. Gebruik in plaats daarvan de syntaxis
let x =
if 5 < 4
then "Hmm"
else "Better"
in "Here's what x is: " ++ x
Bovendien is het gebruik van al die if
‘s niet de beste manier in Haskell. In plaats daarvan kunt u de bewakingssyntaxis gebruiken:
insideText x
| elem x [2,3,7] = "Best"
| elem x [8,9,0] = "Better"
| otherwise = "Ok."
Antwoord 4, autoriteit 10%
Voor de volledigheid, hier de syntaxis van de bewaker voorgesteld door @hammar:
myScore x
| x > 90 = "A"
| x > 80 = "B"
| x > 70 = "C"
| x > 60 = "D"
| otherwise = "F"
(Wat dacht je van “E”?)
Merk op dat het niet nodig is om x > 80 && x < 90
hier, want als het de eerste bewaker passeert, moet het zijn dat x <= 90
. En dus voor alle volgende bewakers: alle voorgaande bewakers zijn gegarandeerd vals, wanneer een bewaker wordt berecht.
Dit corrigeert ook de logische fout om een ‘F’ te scoren als x == 90.