Haskell

[TOC]

Haskell

GHCI

  1. 通過(guò)Tab可以自動(dòng)補(bǔ)全
  2. 通過(guò) :browser 模塊名稱(chēng)胎食,瀏覽該模塊下的函數(shù)
  3. :info 函數(shù)名 顯示函數(shù)相關(guān)信息
  4. :set +t 每次輸出都會(huì)攜帶輸出類(lèi)型信息

標(biāo)準(zhǔn)庫(kù)函數(shù)

map

遍歷數(shù)組蹬耘,針對(duì)數(shù)組中的元素進(jìn)行映射轉(zhuǎn)換處理;映射轉(zhuǎn)換是有一個(gè)函數(shù)組成的


-- (\x -> x ^2 ) 表示定義了一個(gè)匿名函數(shù)(lambda 表達(dá)式)
-- 從[1..10] 這個(gè)數(shù)組中取出每一個(gè)元素,傳給匿名函數(shù)位岔,x則表示的就是傳入的元素
-- 針對(duì)傳入的元素做平方操作后放回到數(shù)組中

map (\x -> x ^2 ) [1..10]

-- out: [1,4,9,16,25,36,49,64,81,100]

filter

遍歷數(shù)組,針對(duì)數(shù)組中的元素進(jìn)行過(guò)濾判斷處理抒抬;過(guò)濾判斷函數(shù)必須返回值為Bool類(lèi)型


filter (\x -> x `mod` 3 == 0 ) [5..25]

-- out : [6,9,12,15,18,21,24]

lambda 表達(dá)式

\ 作為開(kāi)始,并且需要用括號(hào)包裹妖胀; -> 之前的是參數(shù),多個(gè)參數(shù)用空格分隔赚抡,之后的表示函數(shù)體纠屋;

關(guān)鍵字 fold

針對(duì)數(shù)組進(jìn)行左右折疊操作

foldl/foldr scanl/scanr

foldl 左折疊操作 foldr 右折疊操作
scanl 記錄折疊操作狀態(tài),相當(dāng)于是foldl的執(zhí)行過(guò)程記錄
foldl1 foldr1 相比f(wàn)old1 少了累計(jì)值售担,其實(shí)累計(jì)值用的是數(shù)組的第一個(gè)元素
scanl1 scanr1


-- foldl :: (b -> a -> b)  -> b -> [a] -> b

-- (+) 對(duì)應(yīng) (b -> a -> b) 表示 加函數(shù) 對(duì)應(yīng) b 和 a兩個(gè)參數(shù)并且返回 b類(lèi)型
-- 0  對(duì)應(yīng)  -> b 表示的是累計(jì)值
-- [1..10] 對(duì)應(yīng) -> [a] 表示的是數(shù)組
-- 輸出值 對(duì)應(yīng) -> b

-- 整體過(guò)程: 用 0+1的結(jié)果作為 累計(jì)值族铆,再加 2 ,依次類(lèi)推

foldl (+)  0 [1..10]

--out: 55

scanl (+)  0 [1..10]

--out: [0,1,3,6,10,15,21,28,36,45,55]

含有$ 的函數(shù)

$ 用來(lái)斷開(kāi)整個(gè)函數(shù)哥攘,以使得 $ 的右側(cè)先執(zhí)行,意義在于函數(shù)都是從左到右的優(yōu)先級(jí)献丑;
$ 的優(yōu)先級(jí)最低末捣,一定程度上可以減低括號(hào)的使用


-- 表示 5 * (2+7)
(*) 5 ((+) 2 7) 
-- 兩者等同创橄,如去掉 $ 則無(wú)法正確執(zhí)行
(*) 5  $ (+) 2 7
-- out: 45

-- 此處表示用$ 可以將數(shù)據(jù)作為函數(shù)調(diào)用
map ($ 3) [(4+),(10*),(^2),sqrt]  

-- out : [7.0,30.0,9.0,1.7320508075688772]

Function composition 函數(shù)組合

函數(shù)組合就是多個(gè)函數(shù)組合成一個(gè)串行的函數(shù)鏈,用 點(diǎn)號(hào)(.) 進(jìn)行連接邦邦;
組合函數(shù)是前一個(gè)函數(shù)的參數(shù)類(lèi)型需要同后一個(gè)函數(shù)的回傳值類(lèi)型一致
fx (fy (fz p)) 使用組合方式為 (fx . fy . fz) p醉蚁,fz p執(zhí)行后的返回值類(lèi)型需要同fy的參數(shù)類(lèi)型一致

不建議使用組合方式,形成復(fù)雜的函數(shù)鏈條网棍,可以拆分成多個(gè)子函數(shù)鏈,使用let綁定一個(gè)函數(shù)名稱(chēng)氏身,可以提高代碼可讀性


 4 + (3*4)

-- 使用函數(shù)的方式編寫(xiě) $表示先執(zhí)行 3 *4 
 (+) 4 $ (*) 3 4

-- 使用點(diǎn)號(hào)組合函數(shù),組合函數(shù)  
-- +4 和 *3 都是一個(gè)不完全函數(shù),相當(dāng)于是都只傳了一個(gè)參數(shù)的函數(shù)
-- 先將參數(shù) 4 傳給 *3 蛋欣,然后將結(jié)果 12 傳給 +4 ,所以得到16
((+4) . (*3)) 4

 (+4) . (*3) $ 4

let sx = (+4) . (*3) in sx 4

-- out: 16

Module 模塊

模式是含有一組相關(guān)的函數(shù)到踏、型別和型別類(lèi)的組合尚猿;

-- import 用于在代碼中裝載模塊
-- qualified 顯示代碼中需要引用某函數(shù)時(shí)需要加上 Data.Map前綴,為了解決加載模塊中函數(shù)名沖突的情況
-- as M讹躯,則是簡(jiǎn)寫(xiě) Data.Map前綴 為M
import qualified Data.Map as M;

構(gòu)建模塊

-- 以hs文件名 構(gòu)建模塊
module fileName
( functionName1,
  functionName2,
  functionName3
) where

-- 以hs文件所在目錄缠劝,構(gòu)建子模塊
module fileDir.fileName
( functionName1,
  functionName2,
  functionName3
) where

構(gòu)建Types 和 Typeclasses


data Shape = Circle Float Float Float | Ractangle Float Float Float


Record Syntax

Type parameters 型別參數(shù)

類(lèi)似java 里面的泛型,針對(duì)型別不固定的情況惨恭,可以用型別參數(shù)的方式達(dá)到更好的通用性


-- Map 就是攜帶了 k v 兩個(gè)型別參數(shù)
import qualified Data.Map as Map 

Derived instances

deriving (Eq, Ord, Show, Read, Bounded, Enum)

  • Eq 比較
  • Ord 排序
  • Show 顯示成字符串
  • Read 解析成具體的型別
  • Bounded 邊界
  • Enum 枚舉

Type synonyms

型別同義詞,相當(dāng)于給型別取了個(gè)別名

-- String 就是字符數(shù)組的別名
type String = [Char]

Recursive data structures (遞歸地定義數(shù)據(jù)結(jié)構(gòu))

在定義型別時(shí)萝究,值構(gòu)造子又使用了定義的型別锉罐,形成遞歸

-- 模擬標(biāo)準(zhǔn)庫(kù)中的List的遞歸  
data List a = EmptyList | Cons { listHead:: a, listTail :: List a } deriving (Show,Read,Eq,Ord)

IO

工具

  1. 檢索函數(shù)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末脓规,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子侨舆,更是在濱河造成了極大的恐慌,老刑警劉巖挨下,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件臭笆,死亡現(xiàn)場(chǎng)離奇詭異秤掌,居然都是意外死亡鹰霍,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)衅谷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)似将,“玉大人,你說(shuō)我怎么就攤上這事玷氏∫干啵” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵赞辩,是天一觀(guān)的道長(zhǎng)授艰。 經(jīng)常有香客問(wèn)我辨嗽,道長(zhǎng)淮腾,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任洲押,我火速辦了婚禮圆凰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘娘荡。我一直安慰自己驶沼,他們只是感情好炮沐,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布大年。 她就那樣靜靜地躺著,像睡著了一般翔试。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上垦缅,一...
    開(kāi)封第一講書(shū)人閱讀 52,457評(píng)論 1 311
  • 那天壁涎,我揣著相機(jī)與錄音,去河邊找鬼怔球。 笑死,一個(gè)胖子當(dāng)著我的面吹牛闽巩,可吹牛的內(nèi)容都是我干的担汤。 我是一名探鬼主播涎跨,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼六敬,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼驾荣!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起播掷,我...
    開(kāi)封第一講書(shū)人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎垒酬,沒(méi)想到半個(gè)月后件炉,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡口糕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年磕蛇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了十办。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片超棺。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖件相,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情适肠,我是刑警寧澤候引,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布敦跌,位于F島的核電站,受9級(jí)特大地震影響柠傍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜从媚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一患整、第九天 我趴在偏房一處隱蔽的房頂上張望拜效。 院中可真熱鬧,春花似錦紧憾、人聲如沸昌渤。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至甸赃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間毁腿,已是汗流浹背苛茂。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工鸠窗, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人稍计。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像净刮,于是被迫代替她去往敵國(guó)和親硅则。 傳聞我的和親對(duì)象是個(gè)殘疾皇子淹父,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容

  • 工具 haskell platform暑认,直接百度安裝. 打開(kāi)控制臺(tái)輸入ghci即進(jìn)入交互模式大审。 假如定義了myfu...
    咣咣當(dāng)閱讀 11,188評(píng)論 4 6
  • 136.泛型 泛型代碼讓你可以寫(xiě)出靈活,可重用的函數(shù)和類(lèi)型,它們可以使用任何類(lèi)型,受你定義的需求的約束。你可以寫(xiě)出...
    無(wú)灃閱讀 1,476評(píng)論 0 4
  • 在 ghci 里設(shè)置一下顯示類(lèi)型信息: 設(shè)置了 +t 后粮彤,執(zhí)行結(jié)果后面會(huì)跟一行顯示結(jié)果的類(lèi)型,每次退出 ghci ...
    焉知非魚(yú)閱讀 1,976評(píng)論 0 0
  • 第一章 類(lèi)型系統(tǒng)和函數(shù) 類(lèi)型 數(shù)據(jù)類(lèi)型 Bool Char Int Word Integer Float Doub...
    15d843cd48a8閱讀 1,725評(píng)論 0 1
  • 類(lèi)型系統(tǒng) 強(qiáng)大的類(lèi)型系統(tǒng)是 Haskell的 一個(gè)非常大的優(yōu)勢(shì)姜骡。 Haskell 所有表達(dá)式類(lèi)型在編譯時(shí)判斷。這樣...
    焉知非魚(yú)閱讀 1,776評(píng)論 2 3