和6歲孩子的函數(shù)式編程對話
前言: 今天看到Brent寫的一篇有趣的文章,分享給大家,尤其適合有孩子的程序員家長。
昨天,我正在讀一篇關(guān)于函數(shù)式編程的學術(shù)論文,6歲的兒子朝我走過來,問道:“你在看什么呢?”
我不知道從哪里開始給他解釋,于是決定直接了當?shù)鼗卮穑?ldquo;我正在看一個關(guān)于自由定理的很長的故事。”
他追問到:“什么是自由定理?”
這該對一個6歲的孩子怎么解釋呢? 但是作為一個老師, 我不會在教學挑戰(zhàn)面前退縮的。
我想了一會兒,問道:“你知道什么是函數(shù)嗎?”
他不知道。
“函數(shù)有點兒像機器,你可以把一些東西從一端放進去,然后另一端就會出來一些東西。舉個例子,你把一個數(shù)字放進去,然后比這個數(shù)字大1的一個數(shù)就會出來,比如你放進去3,出來一個4, 你放進去6,出來一個7 。”
這對他來清晰易懂,于是我繼續(xù)解釋:“函數(shù)有類型,類型能告訴我們什么樣的東西放進去,什么樣的東西取出來。比如你放進去一個數(shù)字,取出來一個數(shù)字;或者你放進去一個包含幾個數(shù)字的列表,然后也取出來一個數(shù)字。”
他很興奮地把我打斷了:“也許我可以把單詞放進去?”
“沒錯,你可以把單詞放進去,再把單詞取出來。或者有一個特殊的函數(shù)機器,可以讓你把函數(shù)機器放進去,然后取出一個新的函數(shù)機器!”
他倒吸了一口涼氣:“一個產(chǎn)生機器的機器!”
“所以,” 我總結(jié)道,“自由定理就是你僅僅知道這個函數(shù)機器的類型,不知道它內(nèi)部到底干了啥,但是你現(xiàn)在可以對這個函數(shù)機器說一些總是為真的斷言。”
很明顯,這遠遠超出了他的認知。不過整個談話給了我一點靈感。
“嗨,我想到了一個好主意,” 我說,“咱們來玩一個函數(shù)機器游戲吧,我會在腦海中想一個函數(shù)機器,你告訴我想放進去什么東西,我告訴你什么東西會從機器中出來,然后你可以猜一猜這個函數(shù)機器做了什么事情。”
他立刻喜歡上了這個游戲,這對我是個巨大的“打擊”,因為他想一直玩下去。昨天晚上我開車去參加一個派對的時候在玩,我早上沖澡的時候也在玩。
到目前為止,他正確地猜出了這些“函數(shù)機器”







這一個對他有點難度:

我意識到在幾種情況下,他能理解函數(shù)的功能,但是不容易用語言表達出來。
于是我們對有些做了一些改變,一旦他覺得自己猜出了函數(shù)的功能,我們就調(diào)換角色, 由我來指定輸入,他來根據(jù)自己的理解產(chǎn)生輸出,看看和我想的對不對。

這個函數(shù)機器對他來說出乎意料地難猜(雖然他最終猜對了),他花了很長時間猜測,因為他以為機器會對輸入數(shù)字做點兒數(shù)學運算, 所以總想找到一個“公式”。
他沒有想到的是,函數(shù)機器可以根本就不關(guān)心輸入數(shù)據(jù)。無論你輸入什么, 機器的每次的輸出都是 6 !(有趣的是,在我的函數(shù)式編程課上,很多學生在做Lambda演算的時候,也對cosntant function非常困惑。)
經(jīng)過幾輪對我的函數(shù)機器猜測之后,小家伙也想構(gòu)造出他的函數(shù)讓我猜了!有時候他的函數(shù)非常棒,有時候確沒什么意義。不管怎樣,這很有趣 !
當他最終理解了 這個函數(shù)做的事情:

隨后,他也想出了這樣“復雜的”函數(shù):

我想這是因為他受到了幼兒園課程的啟發(fā),在那里他學到了一對兒加起來等于10的數(shù)字。
這絕對是我教育孩子最好的時光之一。
---------------------------------------
我看完后覺得這游戲非常有趣,也拉著閨女玩了起來。
我們玩了幾輪以后,她開始構(gòu)造函數(shù)機器,讓我猜。
可是玩了幾個普通的函數(shù)以后,小孩子就不按常理出牌了,比如居然給我整了一個返回隨機數(shù)的函數(shù),這可真不好猜。
還有一個非常有代表性的函數(shù)機器:
- 我說:10 , 她說 :1
- 我說:9, 她說 :2
- 我說:33, 她說 :3
- 我說:34 , 她說 :4
我一下子明白了,她這個函數(shù)不是“純函數(shù)”,是有狀態(tài)的 !
或者無意中搞了一個閉包。

這可怎么給她解釋?!


2013-09-09 09:41:34
2011-08-24 09:13:40




