###两个冒号 ::
符号 :: 读作 ” 具有类型”, 比如 x :: y 形式的内容 就应该理解成: 表达式x具有类型y
有几种情况, 一种是
函数定义,冒号前是 函数名称, 冒号后 是函数的输入输出的类型定义
另外就是 列表的类型定义, 如 [1,2,3,4,5] :: [Int] 表示 [1,2,3,4,5] 是一个Int类型的列表
['a', 'a', 'b'] :: String 表示 一个字符列表, 也就是字符串
很多时候都不需要进行类型声明。那是因为 Haskell 可以暗中推断,不必声明之。也就是说,如果省略 :: 和后面的类型,Haskell编译器会推断这个表达式的类型。
###两横 (两个减号) –
单行注释
###大括号和减号 {- -}
括起来的部分都是注释, 前括号 和 后括号 可以放在不同的行
###右箭头 ->
定义函数的输入输出的类型, 也就是定义函数的类型
1)如果只有输入, 没有输出, 就没有箭头
2) 有多个输入参数, 依次用 -> 相连, 最后一个才是 输出
另外,在case表达式中, 连接模式和相应的结果, 如
firstDigit :: String -> Char
firstDigit st
= case (digits st) of
[] -> '\0'
(x:_) -> x
一个case 表达式可用于区分不同的分支选择, 在上面这个例子中,是空列表和非空列表
###左箭头 <-
属于, 在list comprehension中, 表示一个元素 属于 哪个列表 (集合)
这个跟数学符号 表示 元素属于哪个集合,是一样的意思
另外一种用法 类似于 赋值
do { n <- readLn ; print (n^2) }
这段代码,就是将从标准输入读取到的数字 赋值给 n, 然后打印出n的平方
但是只限于 IO,Maybe,[] action, 对于普通的函数, 必须用 let = 来赋值
###vertical bar符号 |
竖线符号, 这个符号,在C语言中表示按位与
在Haskell中表示 guide
用来在函数中表示不同的情况, 有点类似与C语言的switch case的意思
比如,求两整数之间的最大值
max :: Int -> Int -> Int
max x y --max是函数名, x y是两个形式参数
| x >=y = x --表示如果x>=y 这个条件成立,最大值就等于x
| otherwise = y
guide是模式匹配的扩展, 可以将竖线读作 ” 当…时”
另外,在list comprehension中, 竖线 分割列表的定义和描述
设列表ex为[2, 4, 7] 则列表概括 [2*n | n <- ex] 表示列表 [4, 8, 14]
第3种情况,就是用data定义数据时用来枚举不同的情况
data Maybe a = Nothing
| Just a
data Either a b = Left a
| Right b
data Color
= Red
| Orange
| Yellow
| Green
| Blue
| Purple
| White
| Black
它与guide的区别是,第1种情况的前面,不需要 | 符号, 而guide的每种情况都需要
###元组 (,,)
括号里有若干个用逗号分割开的元素
这个概念跟python中的tuple是差不多的
###列表 [,,]
方括号中包含 若干个逗号分割开的元素
跟python中list也是差不多的
++
列表的连接, 比如 “Hello” ++ “World” 的结果是 “HelloWorld”
=>
(Eq a) => a -> a -> Bool
它左边的部分叫做类型约束(type constraint), 有人把 类型约束叫做 context
下划线 _
通配符, 在模式匹配中, 可以与任何参数都匹配
比如 x:_ 匹配非空列表
###单冒号 :
在列表中,表示连接, 如 3:[] = [3] 以及 2:[3] = [2,3]
冒号称之为cons运算
###反引号 英文中叫做gave accent, 或者backquote , backtick. 键盘中中, 它在 ~ 符号的下面, 也就是按住shift会输入~, 不按shift就会输入
###两个感叹号 !!
取列表的下标元素
如
let x = [abcdefg]
x!!6
就为’g’
###关键字
case
class
data
default
deriving 这个不常见
do
else
if
import
in
infix 这3个也不常见
infixl
infixr
instance
let
module
newtype
of
then
type
where
这样说来,关键字是没有多少的
###单引号’
-
用单引号将单个字符括起来, 这与C语言中的语法是一致的
-
单个单引号是函数名的一部分, 比如 foldl’
作为高阶函数参数的函数通常命名冠以 f、g 等,但有时也像类型变量后门带一些数字进行修饰那样, 函数名后面会带单引号 ‘ 进行修饰 ,例如像 g’
在以后的例子中,你可以把它读作 “Jee-prime”,并且它被认为是一个与 g 函数有特定关系(a helper or the like)的函数。
比如
foldl — 从左到右遍历它的结构
foldl’ — a fold that is strict in its accumulator, “‘” is used to indicate a strict variant of a function
###点号.
函数复合
(f.g) 3
###美元符号 $
函数应用 function application
在标准库Prelude中, ($)的定义为
f $ x = f x
这个函数的优先级非常低, 这意味着它可以用来代替括号
foo x y = bar y (baz (fluff (ork x)))
可以改写成
foo x y = bar y $ baz $ fluff $ ork x
这基本上类似于 函数复合 点号的语法
###反斜线
匿名函数,lamda函数
例如
\xs -> length xs > 15
就定义了一个lamda函数,它的参数是xs, 左右就是判断 xs的长度是否大于 15