《Haskell趣学指南》笔记之基本语法

栏目: 编程语言 · 发布时间: 5年前

  • Haskell 是纯函数式的(不能赋值,引用透明)
  • Haskell 是 lazy 的
  • Haskell 是静态类型的
  • Haskell 支持类型推导
  • :l myfunctions 可以加载同目录的 myfunctions.hs,且可以重复执行
  • :set prompt "ghci> " 可以改 prompt
    :set prompt "\ESC[0;37m%s\n\ESC[1;91mλ \ESC[m"
    
  • putStrLn 可以打印出中文字符串

第 1 章

  • 5 * -3 要写成 5 * (-3) ,不然报错
  • 布尔用 True 和 False
  • 1 + '1' 会报错, 5 + 0.4 不报错,因为 5 也可以被看作 5.0

函数

  • Haskell 中有一些中缀函数,如 * 和 +
    • 只要以特殊字符命名函数,即可自动将它视为中缀函数。 Miran Lipovaca. Haskell趣学指南(异步图书) (新锐编程语言集萃) (p. 111). 人民邮电出版社. Kindle 版本.
  • Haskell 大部分属于前缀函数,如
    succ 8
    min 1 2
    max 1 2
    div 9 3
    
  • 函数调用的优先级最高, succ 9 * 10 等价与 (succ 9) * 10
  • 后缀可以变中缀: div 9 3 可以改成 9 `div` 3
  • 单参数函数 doubleMe x = x + x
  • 双参数函数 doubleUs x y = x * 2 + y * 2
  • 函数定义没有先后顺序的概念
  • 条件语句 if <condition> then <exp> else <exp> 不能省略 else
  • 条件语句是表达式而不是语句,总是有返回值
  • 函数名可以包含 ' 字符,一般以 ' 结尾的函数是非惰性求值版本,也叫严格求值
  • 函数名不能以大写字母开头,因为大写字母开头的是类型
  • 没有参数的函数被称为定义或者名字,如 a = 1

列表

  • 列表是单类型 homogeneous 的数据结构,只能存储类型相同的元素,不能储存类型不同的元素
  • a = [1,2,3]
  • 使用 ++ 可以拼接两个列表,但是它会遍历第一个列表
  • "hello"['h','e','l','l','o'] 的语法糖
  • 使用 Cons 运算符 : 可以在列表头部插入一个元素 1:[2,3]
  • [1,2]1:2:[] 的语法糖
  • 按索引获取值可以用 !! 符号: [1,2,3] !! 0 值为 1,索引越界会报错
  • [3, 2, 1] > [2, 1, 0] 值为 True
  • 更多列表操作: head/tail/last/init/length/null/reverse/task 3/drop 3/maximum/minimum/sum/product求积
    《Haskell趣学指南》笔记之基本语法
  • head [] 报错
  • 4 `elem` [3,4,5] 值为 True
  • [1..20] 生成 1 到 20 这 20 个数字组成的列表
  • ['a'..'z'] / ['K'..'Z']
  • [2,4..20] 生成 [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
  • [20..1] 会得到空列表,应该写成 [20,19..1]
  • take 24 [13, 26..]
  • cycle [1, 2, 3] 会对列表进行无限循环,得到 1,2,3,1,2,3,1,2,3... 组成的列表
  • repeat 5 会得到由 5 组成的无限列表
  • repeat 3 10 会得到 [10,10,10]

列表推导式

  • [x* 2 | x <- [1.. 10]] 得到 [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
  • [x* 2 | x <- [1.. 10], x>5, filter2, filter3] 可以对 x 进行过滤
  • [ x* y | x <-[1, 3, 5], y <- [2, 4, 6]] 得到长度为 9 的列表 [2,4,6,6,12,18,10,20,30]
  • [ x* y | x <-[1, 3, 5], y <- [2, 4, 6], x* y > 10] 得到 [12,18,20,30]
  • length' xs = sum [1 | _ <- xs] 可以使用这个 length' 函数求列表的长度
  • 还能嵌套:
    ghci> xxs = [[1, 3, 5, 2, 3, 1, 2, 4, 5],[ 1, 2, 3, 4, 5, 6, 7, 8, 9],[ 1, 2, 4, 2, 1, 6, 3, 1, 3, 2, 3, 6]]
    ghci> [ [ x | x <- xs, even x ] | xs <- xxs]
    [[2, 2, 4],[ 2, 4, 6, 8],[ 2, 4, 2, 6, 2, 6]]
    复制代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

当下的冲击

当下的冲击

道格拉斯•洛西科夫 (Douglas Rushkoff) / 孙浩 赵晖 / 中信出版社 / 2013-10-1 / 59.00元

这是一个并不符合人本能的社会…… 为什么我们不应该更注重生活的质量而非速度? 为什么我们不用面对面的交流代替冷冰冰电脑屏幕上的文字代码? 为什么我们不可以选择一个虽然有缺陷但有血有肉的人类社会,而非一个虽趋于完美但冷漠的数字世界? 在当下的冲击面前,你正变得越来越弱智:你没有了自己的独特空间,你过多地相信真人秀节目,你成了数字化产品的奴隶并得了数字化精神病,你的生物钟也被打......一起来看看 《当下的冲击》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

MD5 加密
MD5 加密

MD5 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器