Archive for November, 2008

[Haskell筆記]list

Sunday, November 30th, 2008

函數是構建Haskell程序的兩大基本部件之一,另一個則是list(列表)。

list的表示方法很簡單,首先列舉list的各成員,然後以“,”分隔各成員,最後用“[”和“]”標記list的開頭和結尾。比如,[1,2,3,4]。

為了便於以後的稱說,我們通常給list“起個名字”(指定一個符號代表它),例如:

Prelude> let numbers = [1,2,3,4]
Prelude> let truths  = [True, False, False]
Prelude> let strings = ["here", "are", "some", "strings"]

特別要當心的是,list中的成員必須擁有相同的類型。在上面的三個例子中,numberslist的成員都是Integer(整數),truthslist的成員都是Bool(布爾值),stringslist的成員都是String(字符串)(字符串用”"括起來)。不同類型的成員無法在一個list中共存。比如,如果輸入:

Prelude> let mixed = [1,True]

GHCi就會報錯:

<interactive>:1:13:
    No instance for (Num Bool)
      arising from the literal `1' at <interactive>:1:13
    Possible fix: add an instance declaration for (Num Bool)
    In the expression: 1
    In the expression: [1, True]
    In the definition of `mixed': mixed = [1, True]

這是因為1的類型是Integer,而True的類型是Bool,兩者類型不同。

練習

6.1 以下哪些list可以成立,哪些不可以,為什麽?

    1. [12, 80]
    2. [42, "life, universe and everything else"]
    3. ["beer", "sandwiches"]
    4. [5, 4.5]
    5. ["45", "True"]
    6. [pi, 56]

答案

5.1 25

Prelude> areaSquare 5
25

5.2

Prelude> let areaCircle r = pi * r ^ 2
Prelude> let volCylinder r h = areaCircle r * h

5.3

Prelude> let areaRect l w = l * w
Prelude> let areaSquare s = areaRect s s
Prelude> let areaCircle r = pi * r ^ 2
Prelude> let diffOfCnS r = areaCircle r - areaSquare r

[Haskell筆記]函數定義中使用函數

Thursday, November 27th, 2008

定義函數時,可以使用其它已經定義好的函數。比如,求正方形的面積。正方形是矩形的一個特例,所以定義求正方形面積的函數時,可以利用求矩形面積的函數。

Prelude> let areaRect l w = l * w
Prelude> let areaSquare s = areaRect s s

練習

5.1 利用areaSquare求邊長為5的正方形的面積。
5.2 寫一個求圓柱體體積的函數(利用求圓面積的函數)
5.3 寫一個函數解決以下問題:給定圓的半徑,且已知有一正方形的邊長和該半徑相等,求該圓與該正方形面積之差。


答案

4.1 areaTriangle b h = (b * h) / 2

4.2 areaCube l w h = l * w * h

[Haskell筆記]多元函數

Tuesday, November 18th, 2008

上次我們討論了求圓面積的函數,即

f r = pi * r ^ 2

這裏f代表function(函數),表達的信息量很有限。如果我們的程序裏有很多這樣的函數,就很不方便。你得讀完整行纔知道這是一個求圓的函數。為了增加可讀性(或者說方便偷懶,不用讀完函數的整個定義就知道函數是幹啥的),寫成類似以下的形式好一些:

areaCycle r = pi * r ^ 2

好了,求了圓的面積,求了圓的周長(練習3.1),下面我們來求矩形的面積areaRect。和圓不一樣,長方形的面積取決於長和寬。那該怎麽寫呢?很簡單,以空格隔開,依次列出就可以了。

Prelude> let areaRect l w = l * w

那麽,長為5,寬為10的矩形的面積為:

Prelude> areaRect 5 10
50

練習

4.1 寫一個求三角形面積的函數。
4.2 寫一個求長方體體積的函數。


答案:

3.1

g r = 2 * pi * r

拼音有的时候会起干扰作用

Tuesday, November 18th, 2008

例子很多,只举一个,xiong,看上去是齐齿呼,其实是撮口呼。

山寨硬盘盒

Tuesday, November 18th, 2008

送了一把螺丝刀。问题在于这把螺丝刀和硬盘盒上的螺丝不匹配。