haskell簡明入門 一

2021-09-20 08:08:59 字數 4147 閱讀 7593

以下內容引用自haskell官網:

haskell是乙個先進的,純粹的函式式程式語言。乙個典型的宣告式地,靜態型別的**如下:

primes = filterprime [2..] 

where filterprime (p:xs) =

p : filterprime [x | x <- xs, x `mod` p /= 0]

haskell 有如下的特性:

在終端輸入ghci進行入互動模式。如下是一些基本的運算,幾乎不用解釋就可以看懂。

prelude> 2+15

17prelude> 45*90

4050

prelude> 568-23

545prelude> 3/2

1.5prelude> (90-23)*8

536prelude> 50*(100-9028)

-446400

prelude> true && false

false

prelude> true && true

true

prelude> false || true

true

prelude> not false

true

prelude> not (true && true)

false

prelude> 5 == 4

false

prelude> 5 == 5

true

prelude> "hello" == "hello"

true

prelude> 5 /= 4

true

prelude> 5 /= 5

false

3.2.1 haskell 常用內建函式
prelude> succ 10

11

注意haskell中函式的呼叫引數是使用空格的,這一點和傳統的編譯型語言有很大的不同。

prelude> pred 10

9

prelude> min 10 3.4

3.4

如果要比較多個數字的最小值,直接傳遞多個數字作為引數會報錯,比如:

prelude> min 1 19 23

:21:1:

non type-variable argument in the constraint: num (a -> t)

(use flexiblecontexts to permit this)

when checking that 『it』 has the inferred type

it :: forall a t. (num a, num (a -> t), ord (a -> t)) => t

我們可以通過多次呼叫min函式(注意需要加括號)來解決:

prelude> min 1 (min 9 23)

1

prelude> max 9.9 9.0

9.9

prelude> succ 10 + max 10 20 * 3

71prelude> (succ 10) +(max 10 20)*3

71

注意succ 9*10的值是100而不是91,這是因為計算的順序是先計算succ 9得到10,然後再計算10*10=100,如果我們要計算9*10的後繼,需要寫成succ (9*10)的形式。

prelude> div 10 3

3prelude> div 10 5

2

需要注意的是,div函式接收的兩個引數必須是整數,第乙個是被除數,第二個是除數,如果除不盡則返回商,捨棄餘數。傳入數字不能是浮點數,比如下面的形式會報錯:

prelude> div 1.2 3

:31:1:

no instance for (fractional a0) arising from a use of 『it』

the type variable 『a0』 is ambiguous

note: there are several potential instances:

instance integral a => fractional (ghc.real.ratio a)

-- defined in 『ghc.real』

instance fractional double -- defined in 『ghc.float』

instance fractional float -- defined in 『ghc.float』

in the first argument of 『print』, namely 『it』

in a stmt of an interactive ghci command: print it

3.2.2 構建自己的函式
doubleme x = x + x -- 將數字變為兩倍
這個函式非常簡單,就是返回乙個數字的兩倍。注意上面函式的定義方式:首先是函式名字,然後是空格分隔的引數,接著是等於號,等於號後面的是函式的實現。要執行這個函式,需要把它寫在乙個檔案裡,比如add.hs,然後輸入ghci進入命令列模式,輸入:l add.hs就可以載入函式了。下面是它的呼叫計算結果:

prelude> :l add.hs 

[1 of 1] compiling main ( add.hs, interpreted )

ok, modules loaded: main.

*main> doubleme 2

4*main> doubleme 3

6

doubleus x y = x*2 + y*2 -- 兩個數字變為兩倍然後相加
呼叫計算結果為:

*main> doubleus 1 3

8*main> doubleus 0 2

4

usedoubleme x y = doubleme x + doubleme y -- 呼叫簡單函式
對了,忘了說了,haskell中注釋是--

doublesmallnumber x = if x < 100 then x else 2*x --如果x小於100返回x,否則返回2*x
呼叫結果為:

*main> doublesmallnumber 20

20*main> doublesmallnumber 200

400

需要注意的是haskell中if和else一定是一起出現的,else不可以省略,而且本質上if和else都是需要返回乙個值。haskell中所有的函式和表示式都需要返回乙個結果,if語句就是乙個表示式,所以它一定會返回乙個結果。

doublesmallnumber' x = (if x < 100 then x else 2*x) + 1 -- doublesmallnumber返回值加1
我們通常在haskell中在函式名字最後加乙個'來表示對某個函式稍微修改之後得到的新函式。上面的函式如果把括號去掉,那麼只會在x>=100的時候加1了。另外需要注意的是,haskell的函式名字開頭不能是大寫字母。

conano'brien = "it's a-me, conan o'brien!" -- 沒有引數的函式
上面的conano'brien函式定義好了之後,conano'brien就與字串"it's a-me, conan o'brien!"等價了,而且字串的值是不可以修改的。

熱愛程式設計,熱愛機器學習! github: github blog: 個人部落格站點:不再維護)

WeUI 簡明入門指南

之前做智慧型校園的時候想找乙個開源的移動端 ui 框架,找了好多個,比如 的 sui mobile qq 的 frozenui 等,基本都沒有滿意的,這些框架要麼過於龐雜,要麼太像 ios!最後無意間發現了 weui 這個框架,一眼就愛上了!加了 weui 官方 qq 群後發現好多童鞋都不知道怎麼用...

DuiLib入門簡明教程

2013 duilib入門教程彙總 2013 duilib入門簡明教程 前言 1 2013 duilib入門簡明教程 vs環境配置 2 2013 duilib入門簡明教程 第乙個程式 hello world 3 2013 duilib入門簡明教程 響應按鈕事件 4 2013 duilib入門簡明教程...

MySQL簡明入門教程

宣告 sql關鍵字不區分大小寫,注釋使用 建立mt test這個資料庫 create datebase mt test 選擇使用資料庫,意思是後面的操作的資料庫表預設使用該資料庫 use mt test 刪除資料庫 drop datebase mt test 建立表,f id是自增欄位,f id也是...