Correcte syntaxis voor als uitspraken in Haskell

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 letin het conditionele, anders wordt de variabele xzal 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 elsetoevoegen 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 elsemet vier ifen. De compiler klaagt vanwege de ontbrekende elses. 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 xdefinieert het niet buiten zijn lexicale bereik — in dit geval zal xvoor 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 < 90hier, 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.

Other episodes