Question

Caractéristiques

GHC 6.12.1

Mac OS X 10.6.4 x64

MacBook Pro

Problème

Je parviens pas à utiliser la syntaxe let. Le code suivant refuse de compiler:

module Main where

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

J'ai essayé et y = 2 tabuler dans z = 3 encore plus. Pas de dés.

(Indésirable) Solutions

La seule façon que j'ai obtenu le code de compilation est soit

  1. Remplacement des onglets durs avec des espaces.
  2. Remplacement de la clause let avec une clause de where.
Était-ce utile?

La solution

Saizan sur #haskell explique que le Missions dans une expression let avoir à aligner, pas laisser lui-même. Tant que les affectations s'alignent, il est normal d'utiliser les onglets durs ou mous onglets.

code correct:

module Main where

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

Autres conseils

Vous ne pouvez pas contrôler le retrait correctement avec des onglets, car la taille d'un onglet est défini.

Par conséquent, ne pas utiliser les onglets dans Haskell. Ils sont mal.

Indentation chaque déclaration dans le let-bloc au même degré. Aussi bonne forme est le retrait « dans » et « laisser » au même niveau. Par exemple, ..

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

part, je mets virgule à la fin de chaque ligne

module Main where

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

Si vous insistez sur les caractères TAB dans votre source, les compiles suivantes:

module Main where

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

où tous les espaces de premier plan est soit une ou deux pattes, et l'espace entre let et x = 1 est également un onglet. Vu en mode de vi pour faire OET et ligne-ends explicites:

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

Votre vie sera beaucoup plus simple et plus joli votre code si vous passez à des espaces.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top