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.


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 :}.


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).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.