Pergunta

Especificações

GHC 6.12.1

Mac OS X 10.6.4 x64

MacBook Pro

Problema

Estou tendo problemas para usar let sintaxe. O código a seguir se recusa a compilar:

module Main where

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

Eu tentei tabular y = 2 e z = 3 ainda mais. Sem dados.

Soluções (indesejáveis)

A única maneira de comprar o código para compilar é

  1. Substituindo guias duras por espaços.
  2. Substituindo o let Cláusula com um where cláusula.
Foi útil?

Solução

Saizan em #haskell explica que o atribuições em uma expressão let tem que se alinhar, não deixar em si. Enquanto as atribuições se alinham, não há problema em usar guias duras ou guias suaves.

Código correto:

module Main where

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

Outras dicas

Você simplesmente não pode controlar o recuo corretamente com as guias porque o tamanho de uma guia é indefinido.

Portanto, não use guias em Haskell. Eles são maus.

Recupere cada declaração no let-bloqueio no mesmo grau. Também a boa forma é recuperar o 'in' e 'vamos' ao mesmo nível. Por exemplo..

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

Pessoalmente, coloquei semicolon no final de cada linha

module Main where

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

Se você insistir nos caracteres da guia em sua fonte, os seguintes compilam:

module Main where

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

onde todo o espaço de branco principal é uma ou duas guias, e o espaço em branco entre let e x = 1 também é uma guia. Visto em Vi's modo de lista Para tornar as guias e as extremidades de linha explícitas:

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

Sua vida será muito mais simples e seu código mais bonito se você mudar para os espaços.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top