Результат функции Haskell - PullRequest
2 голосов
/ 29 мая 2019

Я новичок в Haskell и работаю над проблемой для этой функции:

iter :: (t -> t) -> t -> [t]
iter f a = a : iter f (f a)
myList = iter (\x -> x + 2) 1

Насколько я понимаю, это так:

iter принимает два аргумента (t-> t) и t и возвращает список [t].

Я запутался в следующей части:

iter f a = a : iter f (f a)

- это myList [1,3] или я думаю об этом внеправильный путь?

Или это будет [1,3,5,7 ..]?

1 Ответ

6 голосов
/ 29 мая 2019

myList действительно представляет бесконечный список [1,3,..].Однако список генерируется лениво;рекурсивный вызов iter производится только при необходимости.Рассмотрим вариант взятия myList:

head :: [a] -> a
head (x:_) = x

head myList == head (iter (\x -> x + 2) 1)  -- definition of myList
            == head (1 : iter (\x -> x + 2) ((\x -> x + 2) 1)) -- definition of iter
            == 1 -- definition of head

Рекурсивный вызов iter, определенный в определении iter, никогда не выполняется, поскольку head никогда не пытается использовать хвост myList.


Здесь отмечу, что iter действительно является примером corecursive функции, а не рекурсивной функцией.Строгая оценка Хаскелла стирает грань между ними.Смотри https://softwareengineering.stackexchange.com/q/144274/206609.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...