与六岁孩子关于函数式编程的对话(2018)
昨天,我六岁的儿子走到我面前。“你在读什么?”当时,我正在阅读贾尼斯·沃伊特兰德的博士论文的一部分。我不知道该从哪里开始,只好直接回答:“我在读一个关于自由定理的很长的故事。”他继续问:“什么是自由定理?”我从来不怕教学上的挑战,思考了一下,然后开始说:“你知道什么是函数吗?”他不知道。“函数就像一台机器,你从一端放入一些东西,另一端出来一些东西。例如,可能你放入一个数字,出来的数字是比它大一的数字。所以如果你放入三,四就出来,或者如果你放入六,七就出来。”这显然让他明白了,所以我继续:“函数机器的类型告诉你可以放入什么类型的东西以及会出来什么类型的东西。所以也许你放入一个数字然后得到一个数字。或者也许你放入一个数字列表,然后得到一个数字。”他兴奋地打断我:“或者你可以放入单词?”“是的,没错!也许你可以放入单词然后得到单词。或者也许有一个函数机器,你可以把其他函数机器放进去,然后得到函数机器出来!”他对将函数机器放入函数机器的想法感到震惊。“所以,”我总结道,“自由定理就是当你知道函数机器的类型时,可以说一些始终成立的关于函数机器的话,但你不知道它内部具体做了什么。”这似乎对他有点超出理解能力(公平地说,自由定理只有在涉及多态性时才有趣,而我显然不想深入讨论)。但整个对话让我产生了一个新的想法。“嘿,我有一个好主意,可以玩一个游戏,”我说。“它叫函数机器游戏。我会想一个函数机器。你告诉我放入函数机器的东西,我会告诉你出来什么。然后你必须猜测这个函数机器做了什么。”他立刻喜欢上了这个游戏,并且它非常受欢迎;他总是想玩。我们昨天开车去派对时玩了这个游戏,今天早上在我洗澡的时候也玩了。到目前为止,他已经正确猜到了我的一些函数。虽然我试过但对他来说有点难。我意识到在某些情况下,他可能直观上理解函数做了什么,但在用语言表达时遇到了困难(这也是一个问题),所以我们开始使用明显的变体,一旦猜测者认为他们知道函数做了什么,玩家就交换角色,提出函数的人指定一些输入以测试猜测者是否能够得到正确的输出。对于他来说,猜测也出乎意料地困难(虽然他最终也猜对了)。我想他只是停留在函数对输入进行某种算术运算的观念上,难以想出一种能够无论输入什么都能得到的算术过程!他就是没有想到这个机器可能不在乎输入。(有趣的是,我本学期的函数式编程课上,许多学生在学习λ演算时也被常数函数困扰;他们确实想把输入替换到某个地方,并对被绑定变量根本不出现在主体中感到失望和困惑!)经过几轮猜测我的函数后,他想出了自己的函数让我来猜(我知道他会这样做)。有时他的函数很棒,有时又不太合理(通常是因为他对函数的理解随着时间而变化,尽管他真诚地否认这一点),但无论如何都很有趣。在他终于理解后,他想出了一个自己的函数,这个函数大概是受到他幼儿园班级学习关于相加得的数字对的启发。这绝对是我比较成功的父母日之一。关于布伦特,亨德里克学院计算机科学副教授。函数式程序员,数学家,教师,钢琴家,耶稣的追随者。
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡