Haskell

[TOC]

Haskell

GHCI

  1. 通过Tab可以自动补全
  2. 通过 :browser 模块名称,浏览该模块下的函数
  3. :info 函数名 显示函数相关信息
  4. :set +t 每次输出都会携带输出类型信息

标准库函数

map

遍历数组,针对数组中的元素进行映射转换处理;映射转换是有一个函数组成的


-- (\x -> x ^2 ) 表示定义了一个匿名函数(lambda 表达式)
-- 从[1..10] 这个数组中取出每一个元素,传给匿名函数,x则表示的就是传入的元素
-- 针对传入的元素做平方操作后放回到数组中

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

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

filter

遍历数组,针对数组中的元素进行过滤判断处理;过滤判断函数必须返回值为Bool类型


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

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

lambda 表达式

\ 作为开始,并且需要用括号包裹; -> 之前的是参数,多个参数用空格分隔,之后的表示函数体;

关键字 fold

针对数组进行左右折叠操作

foldl/foldr scanl/scanr

foldl 左折叠操作 foldr 右折叠操作
scanl 记录折叠操作状态,相当于是foldl的执行过程记录
foldl1 foldr1 相比fold1 少了累计值,其实累计值用的是数组的第一个元素
scanl1 scanr1


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

-- (+) 对应 (b -> a -> b) 表示 加函数 对应 b 和 a两个参数并且返回 b类型
-- 0  对应  -> b 表示的是累计值
-- [1..10] 对应 -> [a] 表示的是数组
-- 输出值 对应 -> b

-- 整体过程: 用 0+1的结果作为 累计值,再加 2 ,依次类推

foldl (+)  0 [1..10]

--out: 55

scanl (+)  0 [1..10]

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

含有$ 的函数

$ 用来断开整个函数,以使得 $ 的右侧先执行,意义在于函数都是从左到右的优先级;
$ 的优先级最低,一定程度上可以减低括号的使用


-- 表示 5 * (2+7)
(*) 5 ((+) 2 7) 
-- 两者等同,如去掉 $ 则无法正确执行
(*) 5  $ (+) 2 7
-- out: 45

-- 此处表示用$ 可以将数据作为函数调用
map ($ 3) [(4+),(10*),(^2),sqrt]  

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

Function composition 函数组合

函数组合就是多个函数组合成一个串行的函数链,用 点号(.) 进行连接;
组合函数是前一个函数的参数类型需要同后一个函数的回传值类型一致
fx (fy (fz p)) 使用组合方式为 (fx . fy . fz) p,fz p执行后的返回值类型需要同fy的参数类型一致

不建议使用组合方式,形成复杂的函数链条,可以拆分成多个子函数链,使用let绑定一个函数名称,可以提高代码可读性


 4 + (3*4)

-- 使用函数的方式编写 $表示先执行 3 *4 
 (+) 4 $ (*) 3 4

-- 使用点号组合函数,组合函数  
-- +4 和 *3 都是一个不完全函数,相当于是都只传了一个参数的函数
-- 先将参数 4 传给 *3 ,然后将结果 12 传给 +4 ,所以得到16
((+4) . (*3)) 4

 (+4) . (*3) $ 4

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

-- out: 16

Module 模块

模式是含有一组相关的函数、型别和型别类的组合;

-- import 用于在代码中装载模块
-- qualified 显示代码中需要引用某函数时需要加上 Data.Map前缀,为了解决加载模块中函数名冲突的情况
-- as M,则是简写 Data.Map前缀 为M
import qualified Data.Map as M;

构建模块

-- 以hs文件名 构建模块
module fileName
( functionName1,
  functionName2,
  functionName3
) where

-- 以hs文件所在目录,构建子模块
module fileDir.fileName
( functionName1,
  functionName2,
  functionName3
) where

构建Types 和 Typeclasses


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


Record Syntax

Type parameters 型别参数

类似java 里面的泛型,针对型别不固定的情况,可以用型别参数的方式达到更好的通用性


-- Map 就是携带了 k v 两个型别参数
import qualified Data.Map as Map 

Derived instances

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

  • Eq 比较
  • Ord 排序
  • Show 显示成字符串
  • Read 解析成具体的型别
  • Bounded 边界
  • Enum 枚举

Type synonyms

型别同义词,相当于给型别取了个别名

-- String 就是字符数组的别名
type String = [Char]

Recursive data structures (递归地定义数据结构)

在定义型别时,值构造子又使用了定义的型别,形成递归

-- 模拟标准库中的List的递归  
data List a = EmptyList | Cons { listHead:: a, listTail :: List a } deriving (Show,Read,Eq,Ord)

IO

工具

  1. 检索函数
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,718评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,683评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,207评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,755评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,862评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,050评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,136评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,882评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,330评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,651评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,789评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,477评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,135评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,864评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,099评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,598评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,697评论 2 351

推荐阅读更多精彩内容

  • 工具 haskell platform,直接百度安装. 打开控制台输入ghci即进入交互模式。 假如定义了myfu...
    咣咣当阅读 11,173评论 4 6
  • 136.泛型 泛型代码让你可以写出灵活,可重用的函数和类型,它们可以使用任何类型,受你定义的需求的约束。你可以写出...
    无沣阅读 1,456评论 0 4
  • 在 ghci 里设置一下显示类型信息: 设置了 +t 后,执行结果后面会跟一行显示结果的类型,每次退出 ghci ...
    焉知非鱼阅读 1,964评论 0 0
  • 第一章 类型系统和函数 类型 数据类型 Bool Char Int Word Integer Float Doub...
    15d843cd48a8阅读 1,717评论 0 1
  • 类型系统 强大的类型系统是 Haskell的 一个非常大的优势。 Haskell 所有表达式类型在编译时判断。这样...
    焉知非鱼阅读 1,764评论 2 3