haskell學習心得

最近學了一點haskell,覺得這是一個很有趣的語言,決定繼續學下去,並把它作爲第三中語言,排在java和c++之後。

當然我學他也就幾天而已,理解的可能不對,後續會進一步改善。

haskell是一門函數式語言,調用的入口是main函數,例如:

main=do putStr "Hello world!"

do是當需要執行多個語句時才需要的。


haskell最重要的數據結構是數組,可以如下定義:

a=【1,2,3】

haskell是個嚴格類型的語言,不像有些語言如javascript那樣,根據用途自動轉化數據類型,haskell一旦確定了類型,以後的使用中必須保持這個類型。但是你可以不聲明這個類型,當你賦值給他的時候,他會判斷是何種類型。像上面的a就是一個整數數組類型。如果你希望加入一個string類型的值,比如會失敗的。

針對數組有很多操作,列舉如下:

head tail

init last

連接++

加入:

從數組衍生出來的是tuple,不同與數組,tuple中的元素可以是不同的類型。但是tuple不能分開,必須當成一個整體。

數組很有用的一個用法是做集合,

a=[x|x<-[1..20],odd x]

這個集合包含1到20的自然數中所有的奇數。它由3個部分組成,| 以左的部分是x,右邊<-表示來源於,odd x表示x滿足的條件。


haskell中沒有循環,取而代之的是遞歸調用,舉例來說,數組a中的最大值,如果用循環需要這樣:

int x=max;

for(int tmp:a)

   if(x<tmp) x=tmp;


但是如果用遞歸的話,可以這樣做:

max::[Ord a]=>[a]->a

max [x]=x

max x:xs=if x > max xs then x else max xs


採用這種方式,我們完全不需要循環這種東西,但是雖然理論上是可行的,但多少有些不方便。因爲遍歷數組這樣的操作實在是太常用了。

爲了方便,hasckell還提供了一些基礎方法,最常用的就是map。map接受兩個參數,第一個參數是一個接受一個參數的函數,第二個是數組,返回值也是數組。

map (*2) [1..20]

就是對1到20的整數做一個*2的操作,編程2,4,6,8。。。


MAP的問題是輸入輸出都是一樣長度的數組,這多少有些 不爽,因爲我們經常需要對數組做一些選擇過濾的操作,比如選出【1。。10】中的奇數,可以這樣:

filter (odd) [1..10】

得到[1,3,5,7,9]


zip是另一個有用的函數,他的功能是將兩個數組的元素連起來。

zip [1..10] [1..10]

得到[(1,1),(2,2)..(10,10)]

先寫這些吧,回頭繼續寫。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章