七八個函數,兩三門語言㈠

上一篇博文已經是一個多月前寫的了,春節一晃而過,人也懈怠了一些,趁著周末有點閑情,舉幾個函數式編程常用函數為例,借著Scala、Haskell和JavaScript這三門語言輪流實踐一番,看看這些門語言的表現方式。

評價語言優劣往往是沒太大意義的,我也說過好幾次。代碼長短並不是語言優劣唯一的衡量標準,表達方式、執行效率以及擴展模式、規範程度等等都是必須權衡的,甚至還有個人潛意識裡的舒適度。

一. map與each函數

首先想到的就是mapeach函數。

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的mapeach不太一樣: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中調試功能無法使用?

TAG:函数式编程 | 编程语言 | 软件开发 | 编程 |