函数式
- 只有函数没有对象;
- 通常来说,给定相同输入,这些函数将返回相同的值;
- 这些函数通常没有副作用,也就是说,它们不改变程序的状态;
- 任何变量都只能赋值一次。
Haskell
- 上句结果:
it - 帮助:
:?,设置::set/:unset - 直接运行模块:
runghc <name>.hs - 终端:
ghci - 在ghci中运行模块:
:load <name>.hs,:l <name>.hs;再用:m退出 - 退出ghci:
:quit - 注释单行
--<comments>,多行{-comments-} - 变量名必须小写开头
字符串
- 用
++连接字符串。 - 字符串只是字符列表,空字符串等于空列表。
Prelude> ['a', 'b'] == "ab"
True
- 可以用不带空格的冒号把单个字符连接在字符串开头。
Booleans and others
- 不等于
/=,逻辑非not - 必须正确缩进
if-then-else是函数而非控制结构- 强类型,
if只严格地接受布尔类型参数 - 查看类型:
:t,:type,它们只显示类型而不求值 - 返回结果时显示类型:
:set +t,:unset + t
函数
由于Haskell既是强类型语言,又是静态语言,因此每个函数的定义都包含两个部分:
- 类型声明:规格说明(可选)
- 函数声明:具体实现
double.hs
递归,模式匹配,哨兵表达式
Haskell依靠尾递归优化高效地处理递归。
factorial.hs
哨兵表达式是约束参数值的条件
fact_with_guard.hs
- 用点号复合两个函数。
- 三元表达式是
if,then,else
元组和列表
- 列表是同质的,元素类型必须相同。
- 元组可以包含不同类型。
- 通过冒号把元素添加到列表首位。
- 通过冒号匹配Head/Tail
Prelude> let h:t = [1,2,3]
Prelude> h
1
Prelude> t
[2,3]
- 遍历:用Head/Tail匹配递归
lists.hs
zip两个列表得到二元组的列表,长度是较短列表的长度。-
两点表示范围(如
[1..10],[1,3..9])。 - 列表生成式:如
[ (a, b) | a <- crew, b<- crew, a < b]。
Extra
my_reverse.hs
combination.hs
multiplication_table.hs
map.hs
本站文章除注明转载/出处外由 wguosh 创作,均为本站原创或翻译,采用 知识共享署名4.0 国际许可协议进行许可
转载前请务必署名
最后编辑时间为:2021-04-14 20:42:00