七八個函數,兩三門語言㈠
上一篇博文已經是一個多月前寫的了,春節一晃而過,人也懈怠了一些,趁著周末有點閑情,舉幾個函數式編程常用函數為例,借著Scala、Haskell和JavaScript這三門語言輪流實踐一番,看看這些門語言的表現方式。
評價語言優劣往往是沒太大意義的,我也說過好幾次。代碼長短並不是語言優劣唯一的衡量標準,表達方式、執行效率以及擴展模式、規範程度等等都是必須權衡的,甚至還有個人潛意識裡的舒適度。
一. map與each函數
首先想到的就是map和each函數。
1.1 Scala代碼
先來看看map:
List("JavaScript", "HTML5", "CSS3", "SPA") map (_ + "很棒~")n
輸出:
res12: List[String] = List(JavaScript很棒~, HTML5很棒~, CSS3很棒~, SPA很棒~)n
再看看each,Scala中使用foreach:
List("JavaScript", "HTML5", "CSS3", "SPA") foreach (foo => println (foo + "很棒~")) n
輸出:
JavaScript很棒~nHTML5很棒~nCSS3很棒~nSPA很棒~n
1.2 Haskell代碼
好了,放Haskell的map大招(附帶列印效果):
map (++ "很棒~") ["JavaScript", "HTML5", "CSS3", "SPA"]nmapM_ putStrLn $ map (++ "很棒~") ["JavaScript", "HTML5", "CSS3", "SPA"]n
輸出:
["JavaScript2445626834~","HTML52445626834~","CSS32445626834~","SPA2445626834~"]nJavaScript很棒~nHTML5很棒~nCSS3很棒~nSPA很棒~n
Haskell的each?其實Haskell的骨子裡就都是each,包括each自身o(>_<)o ~~。最簡單不過的就是介樣子的列表解析了:
mapM_ putStrLn $ [foo ++ "很棒~" | foo <- ["JavaScript", "HTML5", "CSS3", "SPA"]]n
看懂了閥?輸出同上......ε=(?д?`*)??…
1.3 JavaScript代碼
JavaScript代碼咱就藉助Underscore.js一下,這是一個我非常喜愛的JavaScript FP風格編程輔助器。
要用Underscore.js,當然得先載入它。Underscore.js的map與each不太一樣:map在迭代器中依次操作list每個元素,且返回一個新list,each則在迭代器中依次操作list每個元素,但不返回數據。
先看看map:
_.map(["JavaScript", "HTML5", "CSS3", "SPA"],n function (foo) { return foo + "很棒~"; }, this);n
輸出:
Array [ "JavaScript很棒~", "HTML5很棒~", "CSS3很棒~", "SPA很棒~" ]n
each:
_.each(["JavaScript", "HTML5", "CSS3", "SPA"],n function (foo) { console.log(foo + "很棒~"); }, this);n
輸出:
JavaScript很棒~nHTML5很棒~nCSS3很棒~nSPA很棒~n
另外要提一點的是:作為現代Web開發的范兒,JavaScript對JavaScript Object——嗯——JSON格式的處理理所當然是必須方便的:
_.each({name: "Doog", duang: "Duang~~~", get: "JavaScript"},n function (value, key, list) { console.log(n "Key : " + keyn + "nValue : " + valuen + "nList : " + JSON.stringify(list));n }, this);n
輸出:
"Key : namenValue : DoognList : {"name":"Doog","duang":"Duang~~~","get":"JavaScript"}"n"Key : duangnValue : Duang~~~nList : {"name":"Doog","duang":"Duang~~~","get":"JavaScript"}"n"Key : getnValue : JavaScriptnList : {"name":"Doog","duang":"Duang~~~","get":"JavaScript"}"n
嘿嘿,看明白了沒?(^ω^) `(*>﹏<*)′
二. find函數
find函數一般都是找到滿足條件的第一個元素。2.1 Scala代碼
List("JavaScript", "HTML5", "CSS3", "SPA") find (foo => foo.indexOf("S") > 0)n
輸出:
res40: Option[String] = Some(JavaScript)n
2.2 Haskell代碼
import Data.Listnnfind (foo -> (S `elemIndex` foo) > Just 0) ["JavaScript", "HTML5", "CSS3", "SPA"]n
輸出:
Just "JavaScript"n
2.3 JavaScript代碼
_.find(["JavaScript", "HTML5", "CSS3", "SPA"],n function (foo) { return foo.indexOf("S") > 0; });n
輸出:
"JavaScript"n
------------------------ 上個分割線先 ------------------------
愛瑪!馬上就到12點了,才整了仨函數,看來今晚就先到這裡了,其餘的以後再寫吧(ー_ー)!!
一如既往地順帶發點感悟,對於看書的:
今天便攜機里的Scala運行不起來了,很是奇怪,抽空排查一下。Scala是公認滴複雜嘛?也許是吧,反正看到一些嚷嚷「本語言、本大招世間最簡單」的論調,就要小心別落進坑裡去了。一旦你深入了,可以說沒有哪門技術是簡單的。要說簡單的,就是道理往往想明白了就簡單了:簡單與強大之間,是有天然矛盾的(つд?)傷心......(つд?)傷心......(つд?)傷心......而今識盡愁滋味,欲說還休。欲說還休,卻道天涼好個秋......
推薦閱讀:
※NB-IOT 終端開發板對接 NB-IOT 網路模擬器調試與測試記錄
※一周工作所用的日常 Git 命令
※為什麼我的egg-bin在Visual Studio Code中調試功能無法使用?