Haskell函数过程

时间:2016-09-17 19:14:45

标签: haskell

integerList = [1] ++ integerList

(head (tail integerList))

我运行了这段代码,结果是1,这是一个无休止的递归。 我试图弄清楚haskell如何计算这些函数。有人可以写下这个过程。我想想象它。谢谢!

2 个答案:

答案 0 :(得分:4)

head返回列表的第一个元素。在这种情况下,它返回列表tail integerList的第一个元素。 tail返回没有第一个元素的原始列表。原始列表为integerList,绑定到[1] ++ integerList++运算符连接两个列表,因此结果列表为1 : integerList。将tail应用于此列表会产生integerList,因此tail integerList只会产生integerList

回到开头:用tail integerList替换integerList(因为它评估的内容)得到head integerList。提醒:integerList评估为1 : integerList。将head应用于1

答案 1 :(得分:2)

让我们扩展定义:

integerList = [1] ++ integerList
integerList = foldr (:) integerList [1]  -- inline (++)
integerList = 1 : integerList            -- inline foldr

现在应该清楚integerList是一个循环链表,表示无限的流:

                  __________
                 /          \
                |           |
                V           |
              +---+---+---+ |
integerList = | : | o | o | |
              +---+-|-+-|-+ |
                    |   \___/
                    V
                  +---+
                  | 1 |
                  +---+

就像你写了以下C:

struct Cell { int head; struct Cell *tail; };

struct Cell *integerList = malloc(sizeof(struct Cell));
integerList->head = 1;
integerList->tail = integerList;

tail的{​​{1}}为integerListintegerListhead。您可以使用许多标准前奏函数来操纵无限流,例如1takedropWhile等。例如,foldr生成take 5 integerList。您还可以使用[1, 1, 1, 1, 1]函数定义integerListrepeat