2010-08-09 5 views
6

SpecHaskell errore: Errore di analisi sull'ingresso `='

GHC 6.12.1

Mac OS X 10.6.4 x64

MacBook Pro

Problema

Ho problemi con la sintassi let. Il seguente codice si rifiuta di compilazione:

module Main where 

main = let x = 1 
     y = 2 
     z = 3 
    in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z 

ho provato tabulazione in y = 2 e z = 3 ancora di più. Niente da fare.

(indesiderati) Soluzioni

L'unico modo che ho ottenuto il codice per compilare è o

  1. Sostituzione schede duri con gli spazi.
  2. Sostituzione della clausola let con una clausola where.
+2

non usare mai schede con Haskell, utilizzare sempre gli spazi.Le schede in haskell sono definite come 8 spazi, che è molto più di quanto le persone spesso si aspettino/impostino il loro editor, quindi è sempre consigliabile utilizzare gli spazi. Qualsiasi editor decente ti consentirà di creare schede producendo spazi. – Axman6

+0

Ho trovato questo eccellente aiuto visivo e un'ottima guida sull'argomento in generale: [http://echo.rsmw.net/n00bfaq.html#visualaid](http://echo.rsmw.net/n00bfaq.html# visualaid) – Brandon

risposta

15

Saizan su #haskell spiega che le assegnazioni in un'espressione lasciare che hanno per allineare, non lascia stessa. Finché i compiti sono allineati, va bene usare schede rigide o schede morbide.

codice corretto:

module Main where 

main = let 
     x = 1 
     y = 2 
     z = 3 
    in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z 
+1

Ho trovato che i collegamenti (x, y, z) devono essere allineati verticalmente rispetto ai segni di assegnazione (=) dei 3 collegamenti che possono essere difficili da vedere con questo esempio. – ssanj

3

Rientranza ogni dichiarazione nel blocco di blocco nello stesso grado. Anche una buona forma è quella di far rientrare "in" e "let" allo stesso livello. Ad esempio ..

main = let x = 1 
      y = 2 
      z = 3 
     in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z 
+0

Come faccio a farlo con le schede rigide? – mcandre

+9

Perché vuoi utilizzare le schede rigide? Stanno tranquillamente bene in linguaggi che non usano indentazione per significato, ma stanno semplicemente rendendo la vita difficile in linguaggi come Haskell o Python. Come sono adesso. – jrockway

+4

Python gestisce le schede rigide in modo eccellente. Una volta, ho avuto problemi a codificare Python tramite un client Web SSH perché il client non poteva inserire le schede. Uso le schede rigide perché detesto dover forzare nuovamente il codice degli altri utenti alla larghezza di indentazione preferita. Le schede rigide non presentano questo problema, poiché gli editor di testo possono visualizzare schede rigide a qualsiasi larghezza. – mcandre

11

semplicemente non si può controllare il rientro correttamente con le schede a causa delle dimensioni di una scheda non è definito.

Pertanto, non utilizzare le schede in Haskell. Sono cattivi

+3

Oppure, per le cose che devono avere un diverso livello di indentazione, utilizzare una nuova riga. Ad esempio, metti 'let' su una riga e' x = 1' su quella successiva. Quindi le schede non sono un problema. – yfeldblum

+0

Neil, mi permetto di dissentire (vedi la mia risposta). Un ragazzo di #haskell è stato in grado di aiutarmi a costruire una versione compilata e con schede rigide. In realtà, la risposta della giustizia è corretta. – mcandre

+0

Ho imparato la lezione nel modo più duro! Sapevo che le schede erano orribili ma ancora usate solo perché non mi aveva mai dato un problema prima. Se sei come me, risparmia un grande mal di testa futuro e prendi questo consiglio, ora! – MasterMastic

1

Se ti ostini a caratteri di tabulazione nel sorgente, i seguenti: compilazioni

module Main where 

main = 
    let x = 1 
     y = 2 
     z = 3 
    in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z 

dove tutti gli spazi di punta è una o due schede e lo spazio bianco tra il let e x = 1 è anche un TAB. Visto in vi di list mode per rendere TAB e la linea-finisce esplicito:

module Main where$ 
$ 
main =$ 
^Ilet^Ix = 1$ 
^I^Iy = 2$ 
^I^Iz = 3$ 
^Iin putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z$

La tua vita sarà molto più semplice e il tuo codice più bella se si passa agli spazi.

+0

Grazie. Non penso di voler ricordare di passare tra let e x ogni volta. Inoltre, qualsiasi codice che invierò probabilmente causerà errori poiché i lettori presumeranno che ci sia uno spazio ordinario lì. – mcandre

+0

Quindi perché le schede rigide rendono il codice più difficile da codificare e leggere! – adamse

2

Personalmente, ho messo punto e virgola alla fine di ogni riga

module Main where 

main = let x = 1 ; 
      y = 2 ; 
      z = 3 
in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z 
+0

Funzionerà con il punto e virgola, ma non lo uso poiché il linguaggio funziona correttamente. Solo per il rientro, utilizza spazi anziché tabulazioni (o tabulazioni). – Jaider