和6岁孩子的函数式编程对话

新闻
昨天,我正在读一篇关于函数式编程的学术论文,6岁的儿子朝我走过来,问道:“你在看什么呢?”我不知道从哪里开始给他解释,于是决定直接了当地回答:“我正在看一个关于自由定理的很长的故事。”

前言: 今天看到Brent写的一篇有趣的文章,分享给大家,尤其适合有孩子的程序员家长。

昨天,我正在读一篇关于函数式编程的学术论文,6岁的儿子朝我走过来,问道:“你在看什么呢?”

我不知道从哪里开始给他解释,于是决定直接了当地回答:“我正在看一个关于自由定理的很长的故事。”

他追问到:“什么是自由定理?”

这该对一个6岁的孩子怎么解释呢? 但是作为一个老师, 我不会在教学挑战面前退缩的。

我想了一会儿,问道:“你知道什么是函数吗?”

他不知道。

“函数有点儿像机器,你可以把一些东西从一端放进去,然后另一端就会出来一些东西。举个例子,你把一个数字放进去,然后比这个数字大1的一个数就会出来,比如你放进去3,出来一个4, 你放进去6,出来一个7 。”

这对他来清晰易懂,于是我继续解释:“函数有类型,类型能告诉我们什么样的东西放进去,什么样的东西取出来。比如你放进去一个数字,取出来一个数字;或者你放进去一个包含几个数字的列表,然后也取出来一个数字。”

他很兴奋地把我打断了:“也许我可以把单词放进去?”

“没错,你可以把单词放进去,再把单词取出来。或者有一个特殊的函数机器,可以让你把函数机器放进去,然后取出一个新的函数机器!”

他倒吸了一口凉气:“一个产生机器的机器!”

“所以,” 我总结道,“自由定理就是你仅仅知道这个函数机器的类型,不知道它内部到底干了啥,但是你现在可以对这个函数机器说一些总是为真的断言。”

很明显,这远远超出了他的认知。不过整个谈话给了我一点灵感。

“嗨,我想到了一个好主意,” 我说,“咱们来玩一个函数机器游戏吧,我会在脑海中想一个函数机器,你告诉我想放进去什么东西,我告诉你什么东西会从机器中出来,然后你可以猜一猜这个函数机器做了什么事情。”

他立刻喜欢上了这个游戏,这对我是个巨大的“打击”,因为他想一直玩下去。昨天晚上我开车去参加一个派对的时候在玩,我早上冲澡的时候也在玩。

到目前为止,他正确地猜出了这些“函数机器”

 

和6岁孩子的函数式编程对话

 

和6岁孩子的函数式编程对话

 

和6岁孩子的函数式编程对话

 

和6岁孩子的函数式编程对话

 

和6岁孩子的函数式编程对话

 

和6岁孩子的函数式编程对话

 

和6岁孩子的函数式编程对话

这一个对他有点难度:

 

和6岁孩子的函数式编程对话

我意识到在几种情况下,他能理解函数的功能,但是不容易用语言表达出来。

于是我们对有些做了一些改变,一旦他觉得自己猜出了函数的功能,我们就调换角色, 由我来指定输入,他来根据自己的理解产生输出,看看和我想的对不对。

 

和6岁孩子的函数式编程对话

这个函数机器对他来说出乎意料地难猜(虽然他最终猜对了),他花了很长时间猜测,因为他以为机器会对输入数字做点儿数学运算, 所以总想找到一个“公式”。

他没有想到的是,函数机器可以根本就不关心输入数据。无论你输入什么, 机器的每次的输出都是 6 !(有趣的是,在我的函数式编程课上,很多学生在做Lambda演算的时候,也对cosntant function非常困惑。)

经过几轮对我的函数机器猜测之后,小家伙也想构造出他的函数让我猜了!有时候他的函数非常棒,有时候确没什么意义。不管怎样,这很有趣 !

当他最终理解了 这个函数做的事情:

 

和6岁孩子的函数式编程对话

随后,他也想出了这样“复杂的”函数:

 

和6岁孩子的函数式编程对话

我想这是因为他受到了幼儿园课程的启发,在那里他学到了一对儿加起来等于10的数字。

这绝对是我教育孩子最好的时光之一。

---------------------------------------

我看完后觉得这游戏非常有趣,也拉着闺女玩了起来。

我们玩了几轮以后,她开始构造函数机器,让我猜。

可是玩了几个普通的函数以后,小孩子就不按常理出牌了,比如居然给我整了一个返回随机数的函数,这可真不好猜。

还有一个非常有代表性的函数机器:

  • 我说:10 , 她说 :1
  • 我说:9, 她说 :2
  • 我说:33, 她说 :3
  • 我说:34 , 她说 :4

我一下子明白了,她这个函数不是“纯函数”,是有状态的 !

或者无意中搞了一个闭包。

 

和6岁孩子的函数式编程对话

这可怎么给她解释?!

责任编辑:未丽燕 来源: 今日头条
相关推荐

2020-05-26 21:17:28

函数式编程纯函数

2011-10-19 15:47:13

2012-03-21 09:30:11

ibmdw

2023-05-06 07:27:47

2020-09-23 16:07:52

JavaScript函数柯里化

2013-09-09 09:41:34

2023-11-21 07:17:36

Reac函数组件

2012-09-21 09:21:44

函数式编程函数式语言编程

2009-07-08 16:10:24

Scala简介面向对象函数式

2020-02-06 19:12:36

Java函数式编程编程语言

2013-06-27 09:31:37

声明式编程命令式编程编程

2023-10-07 00:01:02

Java函数

2011-08-24 09:13:40

编程

2023-12-14 15:31:43

函数式编程python编程

2022-09-22 08:19:26

WebFlux函数式编程

2016-12-30 11:11:30

儿童编程

2016-10-31 20:46:22

函数式编程Javascript

2011-03-08 15:47:32

函数式编程

2020-09-24 10:57:12

编程函数式前端

2017-03-22 11:22:04

JavaScript函数式编程
点赞
收藏

51CTO技术栈公众号