Haskell – parseerfout bij invoer `|’

Ik heb precies die code in een .hs-bestand en bij het laden krijg ik altijd dezelfde parseerfout. Ik denk niet dat het eigenlijk fouten bevat – dus mijn huidige gedachte is dat de “|” teken is niet degene die Haskell wil, maar het is de standaard op mijn Macbook-toetsenbord (met Mac OS). Is het mogelijk, en zo ja, hoe kan ik er omheen? Ik gebruik momenteel TextEdit om de code te schrijven, met de instelling voor platte tekst aan.


Antwoord 1, autoriteit 100%

Zorg ervoor dat u de bewakers inspringt; Haskell heeft veel witruimte.

pow1 b e
    | (e == 0)  = 1
    | otherwise = b * pow1 b (e-1)

Antwoord 2, autoriteit 56%

Het enige wat je hoeft te doen is spaties voor de bewakers toe te voegen en de code werkt prima.

pow1 b e
    | (e == 0)  = 1
    | otherwise = b * pow1 b (e-1)

(user142019 heeft deze oplossing al genoemd, maar ik vond dat er uitleg nodig was om de oplossing te begrijpen)

Uitleg:

Haskell gebruikt spatie-inspringingen om de structuur en het bereik van zijn code te bepalen. Andere programmeertalen (zoals Java bijvoorbeeld) vertrouwen hiervoor op accolades, Haskell heeft in plaats daarvan inspringingen.

Uw code werkt niet omdat Haskell verwacht dat de hoofdtekst van de functie zich op een dieper inspringniveau bevindt dan de functiedefinitie, en andere functiedefinities op hetzelfde niveau. Elke nieuwe regel op hetzelfde inspringingsniveau zou worden geïnterpreteerd als een nieuwe functiedefinitie, die niet mag beginnen met een bewaker |vandaar de parseerfout die u krijgt.

Er is niets mis met je Mac-tekentoets of met je teksteditor.

Over inspringingen: tabbladen werken niet. Je zult dus handmatig spaties moeten invoeren of de tab-instellingen van je editor moeten wijzigen om 4 spaties in te voegen (ik raad aan) in plaats van een tab-teken. (Notepad++ staat dit bijvoorbeeld toe, het is mijn voorkeur voor gebruik met Haskell).


Antwoord 3, autoriteit 12%

Naast het onthouden van het streepje, zag ik deze zin op de websiteIk begon Haskell voor het eerst:

Merk op dat er geen = direct achter de functienaam en zijn parameters staan,
voor de eerste bewaker. Veel nieuwelingen krijgen syntaxisfouten omdat ze het daar soms plaatsen.

Dit is ook belangrijk.

@Greg Haskell herkent het tabteken '\t'niet. Gebruik bij het inspringen/opmaken spaties in plaats van tabs.


Antwoord 4

Ik kreeg deze foutmelding toen ik tabs gebruikte in plaats van spaties na de guard-expressies (‘\t’ staat voor een tab-teken):

pow1 b e  
| (e == 0)\t= 1  
| otherwise = b * pow1 b (e-1)

Other episodes