Por que essa função não termina em Haskell?

8

Estou confuso por que minha função nestque compõe fconsigo mesma nvezes

nest f 0 = id
nest f n = f . nest f (n - 1)

nunca termina. Eu teria pensado que seria "correspondência de padrão" no caso quando nse tornar zero. Estou definindo-o digitando essas duas linhas no GHCI e ligando, nest (+ 1) 2 3por exemplo.

Jon Deaton
fonte
4
Nós precisamos de mais. Como você está definindo e carregando esta função? Como você está chamando essa função? Quando eu o salvar como um arquivo, carregue-o com o GHCi 8.6.4 e chame-o assim nest (+1) 3 2que terminar 5.
Thomas M. DuBuisson
1
Oh interessante. Eu estava colando no GHCI e chamando-o como você nest (+1) 3 2.
Jon Deaton

Respostas:

12

Ao digitar a função em duas linhas REPL separadas, você a redefine essencialmente na segunda vez, omitindo o caso base.

A maneira correta de inserir esta função no REPL é:

nest f 0 = id; nest f n = f . nest f (n - 1)

Como alternativa, você pode entrar no modo de múltiplas linhas com o :{comando e deixá-lo usando :}.

Emily
fonte
6

Quando você colou no GHCi, o que você fez foi definir uma função nest f 0 = id. Então você disse: "ignore essa função, estou substituindo-a por uma nova função com o mesmo nome, onde está toda a definição nest f n = f . nest f (n - 1).

Thomas M. DuBuisson
fonte