天天看點

haskell(21)

本部落格所有内容是原創,未經書面許可,嚴禁任何形式的轉載。

http://blog.csdn.net/u010255642

Scanl1、scanr1與foldl1、foldr1類似,讀取第一個元素,然後以第二個元素為起始元素,scanl1從左邊開始,scanr1從右邊開始。

 *Main> scanl1 (\mmin x->if x<mmin then x else mmin)  [61,53,75,28]

[61,53,53,28]

18、函數應用與函數合成

$函數完成函數應用,擁有最低的優先級,可以用它來替換括号,因為括号通常辨別優先級一樣的情況下函數的調用先後順序。

*Main> sum (filter odd [1,5,8,9,12,16])

15

*Main> sum $filter odd [1,5,8,9,12,16]

*Main> sum (filter odd (scanl (+) 0 [1,5,8,9,12,16]))

110

*Main> sum $filter odd $scanl (+) 0 [1,5,8,9,12,16]

110

.完成函數合成,函數合成将很多函數合成為一個序列,執行的順序是從左到右,即:f.g.h x=f(g(h x))

*Main> map ((>5).mycpd) [1,2,4,8,10,11]

[False,False,True,True,True,True]

*Main> map ((>5).mycpd.abs) [1,-2,4,8,-10,11]

[False,False,True,True,True,True]

*Main>

18、Data.List子產品

可通過下面2種方式引入Data.List子產品,其它子產品也類似

1、 :m + Data.List

2、 import Data.List

也可以隻引入其中的某幾個函數,下面我們引入intersperse和intercalate函數。

Prelude> import Data.List (intersperse,intercalate)

Intercalate将清單中的元素以第一個參數表示的清單為間隔符組裝成一個清單。intersperse将清單中的元素以第一個參數表示的清單為間隔符組裝成清單中的元素。

Prelude Data.List> intercalate " " ["health","is","very","important."]

"health is very important."

Prelude Data.List> intercalate [12,0] [[2,2,2],[3,3,3],[4,4,4],[5,5,5]]

[2,2,2,12,0,3,3,3,12,0,4,4,4,12,0,5,5,5]

Prelude Data.List> 

Prelude Data.List> intersperse '*' "health"

"h*e*a*l*t*h"

Prelude Data.List> intersperse 12 [222,333,444,555]

[222,12,333,12,444,12,555]

我們移去Data.List的子產品,再重新加載它的所有函數

Prelude Data.List> :m - Data.List

Prelude> import Data.List

Transpose将多個清單的元素分别抽取合成同樣多的清單。

Prelude Data.List> transpose [[1,2,3],[4,5,6],[7,8,9]]

[[1,4,7],[2,5,8],[3,6,9]]

Prelude Data.List> transpose [[1,2,3],[4,5,6],[7,8,9],[10,11,12]]

[[1,4,7,10],[2,5,8,11],[3,6,9,12]]

與zip類似,但zip隻接收2個清單為參數,生成的清單的元素是元組。

Prelude Data.List> zip [1,2,3] [4,5,6]

[(1,4),(2,5),(3,6)]

Prelude Data.List> 

Concat将所有的清單元素組合成一個新清單

Prelude Data.List> concat [[1,2,3],[4,5,6],[7,8,9],[10,11,12]]

[1,2,3,4,5,6,7,8,9,10,11,12]

Prelude Data.List>