Estou tentando definir qualquer função simples que abranja várias linhas em ghci, considere o seguinte como exemplo:
let abs n | n >= 0 = n
| otherwise = -n
Até agora, tentei pressionar Enter após a primeira linha:
Prelude> let abs n | n >= 0 = n
Prelude> | otherwise = -n
<interactive>:1:0: parse error on input `|'
Também tentei usar os comandos :{
e, :}
mas não chego longe:
Prelude> :{
unknown command ':{'
use :? for help.
Estou usando o GHC Interactive versão 6.6 para Haskell 98 no Linux, o que estou perdendo?
:{
,:}
.Respostas:
Para guardas (como seu exemplo), você pode colocá-los todos em uma linha e funciona (os guardas não se importam com o espaçamento)
Se você quiser escrever sua função com várias definições que correspondam aos padrões, assim:
Então você usaria chaves com ponto e vírgula separando as definições
fonte
Agora o GHCi possui um modo de entrada multilinha, ativado com: set + m. Por exemplo,
fonte
ghci
se comporte de maneira semelhante ao interpretador Python. Muito conveniente! De fato, você pode criar um.ghci
arquivo em seu diretório pessoal no qual coloca o:set +m
modo multilinha, que se tornará o padrão sempre que iniciarghci
!:set prompt "λ "
as linhas continuadas, diga emPrelude
vez deλ
. Alguma forma de contornar isso?let
. Basta digitar alet
seguido de uma nova linha:let
⏎. Entãofac 0 = 1
⏎. Entãofac n = n * fac (n-1)
⏎ ⏎ e pronto!Dan é correto, mas
:{
e:}
deve aparecer cada um em sua própria linha:Isso também interage com a regra de layout, portanto, ao usar a doação, pode ser mais fácil usar chaves e ponto-e-vírgula explicitamente. Por exemplo, esta definição falha:
Mas funciona quando chaves e pontos-e-vírgulas são adicionados:
Isso realmente será importante ao colar definições de um arquivo, onde o recuo pode mudar.
fonte
Parece
:{
e:}
é um recurso muito novo. Pode ser necessário atualizar o GHC.Edit: confirmado, consulte http://www.haskell.org/ghc/docs/6.8.2/html/users_guide/release-6-8-2.html
fonte
Se você não deseja atualizar o GHC apenas para
:{
e:}
, precisará escrever tudo em uma linha:Não conheço nenhuma definição única em Haskell que deva ser escrita em várias linhas. O acima exposto realmente funciona no GHCi:
Para outras expressões, como
do
blocos, você precisará usar a sintaxe que não é de layout com chaves e ponto e vírgula (eugh).fonte
Estou usando o GHCi, versão 8.2.1 no macOS Catalina 10.15.2. A seguir, é apresentado como eu coloco a declaração do tipo de função e os guardas juntos. Observe que as barras verticais à esquerda são para várias linhas do GHCi.
fonte
:{
e:}
não precisar especificarlet
antes da sua declaração de tipo, o que significa que não é necessário recuar a segunda e as linhas subseqüentes.Parece que colar as duas linhas de uma vez ou usar a tecla Control-Enter para cada nova linha mantém tudo junto, pelo menos em https://repl.it/languages/haskell . Você verá 2 pontos no início da segunda linha. Ou coloque-o em um arquivo e: carregue o arquivo (: l principal). Como é que os abdominais não funcionam com números negativos? Oh, você deve colocar parênteses em torno do número.
fonte