haskell學習筆記(2)-List Comprehension

數學中的集合有兩種表達形式,分別是
列舉法{1,2,3,4,5}
描述法{x|x<=5}
一般的編程語言只支持了列舉法,支持描述法的寥寥無幾,不過haskell就是其中的一種(python的列表推導算半個)


接下來用描述法來表示一些集合
[x*2 | x <- [1..10]]
#相當於[2,4,6,8,10,12,14,16,18,20]

[x*2 | x <- [1..10], x*2 >= 12]
#相當於[12,14,16,18,20]

因爲對一組數據進行處理幾乎是所有編程任務中最常見的幾個,所以haskell特殊的描述法可以使非常多在一般編程語言裏需要不停嵌套循環才能實現的任務,變的十分簡單。

即使是對比一些流式函數式框架,例如java8的stream,rx函數式系列。haskell的列表描述法幾乎也是代碼量最少的。

舉一些例子

#它能夠使 List 中所有大於 10 的奇數變爲 "BANG",小於 10 的奇數變爲 "BOOM"
#haskell裏控制語句也是表達式 例如if
boomBangs xs = [ if x < 10 then "BOOM!" else "BANG!" | x <- xs, odd x]
boomBangs [7..13]
#輸出爲 ["BOOM!","BOOM!","BANG!","BANG!"]

[ x*y | x <- [2,5,10], y <- [8,10,11]]
#輸出[16,20,22,40,50,55,80,100,110]

[ x*y | x <-[2,5,10], y <- [8,10,11], x*y > 50]
#輸出[55,80,100,110]

#求集合長度 _是佔位符
length' xs = sum [1 | _ <- xs]
#返回一個集合 保留大寫
removeNonUppercase st = [ c | c <- st, c `elem` ['A'..'Z']]
#嵌套
[ [ x | x <- xs, even x ] | xs <- xxs]

歡迎關注我的github https://github.com/luckyCatMiao

發佈了108 篇原創文章 · 獲贊 64 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章