integerList = [1] ++ integerList
(head (tail integerList))
我运行了这段代码,结果是1
,这是一个无休止的递归。
我试图弄清楚haskell如何计算这些函数。有人可以写下这个过程。我想想象它。谢谢!
答案 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}}为integerList
,integerList
为head
。您可以使用许多标准前奏函数来操纵无限流,例如1
,take
,dropWhile
等。例如,foldr
生成take 5 integerList
。您还可以使用[1, 1, 1, 1, 1]
函数定义integerList
:repeat
。