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就可以。
沒有留言:
張貼留言