Erro de análise de erro de Haskell na entrada `= '

111

Sou novo em Haskell e depois de começar ghcitentei:

f x = 2 * x

e eu obtive:

<interactive>:1:4: parse error on input `='

que eu não entendo.

Estranhamente, funcionou bem antes. Suponho que tenha configurado Haskell incorretamente. Reinstalar o ghc6 não resolve o problema.

Para obter informações, uso o Ubuntu 10.4 e a versão do ghc6 é 6.12.1-12

Filho
fonte

Respostas:

160

No GHCi 7.x ou anterior, você precisa de um letpara definir as coisas nele.

Prelude> let f x = x * 2
Prelude> f 4
8

A partir do GHC 8.0.1, as ligações de nível superior são suportadas no GHCi , portanto, o código do OP funcionará sem alterações.

GHCi, version 8.0.1.20161213: http://www.haskell.org/ghc/  :? for help
Prelude> f x = x * 2
Prelude> f 4
8
Kennytm
fonte
15
Obrigado. O "haskell do mundo real" (pelo menos a versão que eu tenho) não tem o letem seus exemplos
Micah
43
"Aprenda, Haskell" não menciona isso.
Bakuriu
2
@Bakuriu LYAH se agora mencionar let. Mas um acompanhamento. Em LYAHeu li addThree :: Int -> Int -> Int -> Int(nova linha), addThree x y z = x + y + zmas apenas o segundo GHCicom let. Por quê?
isomorfismos
9
@Bakuriu Sim, mas o autor diz a você para escrever suas definições em um arquivo externo e carregá-lo dentro do GHCI, não para escrevê-las diretamente no GHCI. E o primeiro funciona perfeitamente.
superzamp de
Este tutorial está totalmente errado: seas.upenn.edu/~cis194/lectures/01-intro.html . No entanto, é o primeiro tutorial recomendado no site da haskell!
cammil
51

Quando você digita em um arquivo de origem Haskell,

f x = 2 * x

está correto.

Ao digitar diretamente no ghci, você precisa digitar letno início da linha:

let f x = 2 * x
dave4420
fonte
12
Por que não funciona no GHCi? Por que há uma diferença na sintaxe?
Beat
1
@Beat GHCi tenta avaliar expressões por padrão, não analisa instruções, enquanto o formato do arquivo é o oposto. É por isso que, para fazer declarações (ou seja: definir variáveis, definir funções, etc), você deve declarar que está usando let. Pense no GHCi como uma grande let ... in ...declaração.
AJFarmar de
20

Uma boa regra para usar o ghci é que qualquer código inserido deve estar em conformidade com a semântica do-block; ou seja, você pode supor sintaticamente que está programando dentro da mônada IO (se essa for uma terminologia nova, não se preocupe! Recomendo enfaticamente a leitura deste tutorial ).

Essa resposta ilustra esse ponto com um exemplo e pode fornecer mais informações úteis sobre a natureza de IO e ghci.

Raeez
fonte
26
Essa resposta é inútil para um iniciante. Ele está procurando uma dica simples e prática para avançar, não tópicos avançados. Você não explica produtos polinomiais para uma criança aprendendo a tabuada - isso não mostra o quanto você sabe, mostra que você não sabe como compartilhar o que sabe.
btk
3
@btk: todo mundo tem que deixar de ser iniciante em algum momento. Comecei a aprender Haskell ontem e estou confiante de que dentro de pouco tempo vou entender tudo o que Raeez diz.
Vietnhi Phuvan,
10
Este é o meu primeiro dia aprendendo Haskell, e achei essa resposta muito útil para entender por que devo usar let; Eu estava tipo "wtf, por que eu tenho que usar let" e então eu li isso e fui esclarecido.
Brian Tingle de
4

A partir do GHC 8.0.1, isso não geraria mais um erro.

glguy
fonte