Perl6 Lambda

Perl6 Lambda

Lambda 一直是函數式編程津津樂道的東西,從 Haskell 再到許多編程語言爲了支持函數式,引入了 Lambda,Perl6 也支持 Lambda,但是 Perl6 中的 Lambda 好像又不太一樣。

我理解的 Perl6 中的 Lambda 其實是一個可以傳入參數的代碼塊,而並不是一個 “正宗” 的 subroutine

say -> {}.WHAT; # (Block)
say sub {}.WHAT; # (Sub)

在使用 WHAT 方法的時候,打印出來的是 BlockSub 可見,Perl6 的 lambda 確實是一個代碼塊,因此你可以簡寫到什麼地步呢?

-> $cb {$cb()}({say "hello"}) # hello

這是一個立即執行函數,爲 lambda 接收另一個 lambda 爲參數,內部執行

有一定經驗的同學一定都寫過 Fibonacci,當然,那是最經典的遞歸練習了,如果還不知道的同學可以移步 求解 Fibonacci 的正確姿勢,這裏不再贅述。

來看一個比較刺激的版本,Perl6 實現 Fibonacci

my @fibonacci = 1, 1, * + * ... *;

比如我們要 fibonacci 的第 46項

say @fibonacci[10000]; 

output:

54438373113565281338734260993750380135389184554695967026247715841208582865622349017083051547938960541173822675978026317384359584751116241439174702642959169925586334117906063048089793531476108466259072759367899150677960088306597966641965824937721800381441158841042480997984696487375337180028163763317781927941101369262750979509800713596718023814710669912644214775254478587674568963808002962265133111359929762726679441400101575800043510777465935805362502461707918059226414679005690752321895868142367849593880756423483754386342639635970733756260098962462668746112041739819404875062443709868654315626847186195620146126642232711815040367018825205314845875817193533529827837800351902529239517836689467661917953884712441028463935449484614450778762529520961887597272889220768537396475869543159172434537193611263743926337313005896167248051737986306368115003088396749587102619524631352447499505204198305187168321623283859794627245919771454628218399695789223798912199431775469705216131081096559950638297261253848242007897109054754028438149611930465061866170122983288964352733750792786069444761853525144421077928045979904561298129423809156055033032338919609162236698759922782923191896688017718575555520994653320128446502371153715141749290913104897203455577507196645425232862022019506091483585223882711016708433051169942115775151255510251655931888164048344129557038825477521111577395780115868397072602565614824956460538700280331311861485399805397031555727529693399586079850381581446276433858828529535803424850845426446471681531001533180479567436396815653326152509571127480411928196022148849148284389124178520174507305538928717857923509417743383331506898239354421988805429332440371194867215543576548565499134519271098919802665184564927827827212957649240235507595558205647569365394873317659000206373126570643509709482649710038733517477713403319028105575667931789470024118803094604034362953471997461392274791549730356412633074230824051999996101549784667340458326852960388301120765629245998136251652347093963049734046445106365304163630823669242257761468288461791843224793434406079917883360676846711185597501

打印出的運行時間 0.25212712s,1s 都沒用到!真的太刺激了。

因爲 Perl6 中允許創建一個無限的數組,上面的 @fibonacci 就是一個無限的數組,使用了惰性隊列,只有當用到的時候纔會去計算,其實是在邏輯上是無限的,但是實際不是,數組都是有容量的。

* + * 是一個 WhatEver Code,但是它可以當作函數去調用,但實際上它們是兩種不同的類型,是不兼容的兩種類型。此外 * 不做運算的時候是 WhatEver 類型,它可以代表 Inf,這就是爲什麼是創建的無限容量的數組的原因了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章