code

2017年1月22日 星期日

Erlang筆記4- List Comprehensions

list comprehension

一個更簡潔建立list的方法就是list comprehensions,舉例來說,代替list map如下:


意思是現有的list L中,每個X要被F map成新的value,然後形成一個新的list。
當然X要match L中每個element的pattern。


通式如下:

Qualifier包括:
generators,從某個collection中抽出其中的element pattern,語法為 X <- List
filters,boolean predicates,例如 X > 1

這跟Scala的for generators一樣,所以還是有共通之處。


範例1: quicksort


++ [Pivot] ++ 是infix appending,先不用管他。
可以看到有generator 和 filter qualifiers 組成的list comprehensions。


範例2: 畢氏定理


這個範例中的qualifier是generators,總之generator要能被evaluated to a collection (erlang應該不止有list吧? 待後觀來),所以lists:seq(1,N)產生[1,2, ... , N],是一個合法的generator。

注意 erlang的 boolean operator跟一般語言不太一樣:

X =< Y 解讀成 X小於等於Y的predicate
X =:= Y 解讀成 X等於Y的predicate


範例3: Anagrams


這個有點神奇,竟然兩行就寫完了anagrams演算法?!來看跑起來是什麼結果:


其實沒有啦,愛唬爛!
anagrams的定義不是這樣的,這應該叫做list的所有permutation。

第二個clause的recursion我們先不理他了,這邊只是要告訴你list comprehensions的qualifiers要怎麼寫。這裡的重點是可以是recursion,只要type 能match到collection或是list就可以。


沒有留言:

張貼留言