haskell基础 - kscarrot/blog GitHub Wiki
布尔类型
:t True
:t False
:t otherwise -- True的别名 语义需要
布尔常用方法
(&&) :: Bool -> Bool -> Bool infixr 3(||) :: Bool -> Bool -> Bool infixr 2not :: Bool -> Bool
字符类型
Data.Char ASCII码会直接打印,其他字符会被转成对应的Unicode显示
数值类型
- 有符号整数
Int,和操作系统位数有关 - 无符号整数
Word,和操作系统位数有关 - 任意精度整数
Integer加上0b,0o,0x等前缀可以展示对应进制的整数(注:二进制需要增加BinaryLiterals拓展) - 小数与有理数类型
Float,Double,Rational有理数可以被处理成任意精度整数的除法
列表类型
用[]包括用,并且只包括单一类型
:t [1,True] -- 直接报错
:t [1,1.2] -- 可以,返回Num类型
字符串
> ['H','e','l','l','0']
"Hello" -- String的类型为[Char]
元组类型
用()包裹,可以包含多个类型
- 确认元组后不可伸缩
- 确认元组后对应类型不可改变
元组常用方法
fst :: (a, b) -> asnd :: (a, b) -> bcurry :: ((a, b) -> c) -> a -> b -> cuncurry :: (a -> b -> c) -> (a, b) -> cswap :: (a, b) -> (b, a)
函数类型
一个简单的例子
add :: Int -> Int -> Int -- 类型声明
add x y = x + y -- 绑定实现
main :: IO ()
main = print $ add 1 2 -- 3
函数的定义
函数可以理解为从参数到结果的一个映射
函数柯里化
uncurry :: (a -> b -> c) -> (a, b) -> c
当函数有多个参数时,必须通过元组一次性传入,然后返回结果,这样的函数就是非柯里化的函数
curry :: ((a, b) -> c) -> a -> b -> c
当函数有多个参数时,参数可以一个一个地依次输入,如果参数不足,将返回一个函数作为结果,这样的函数就是柯里化的函数
函数常用方法
恒等映射
id :: a -> a
函数复合
(.) :: (b -> c) -> (a -> b) -> a -> c infixr 9
add :: Int -> Int -> Int -- 类型声明
add x y = x + y -- 绑定实现
add1 = add 1 -- add1 :: Int -> Int +1
add2 = add 2 -- add2 :: Int -> Int +2
main :: IO ()
main = print $ add1 . add2 $ 5
-- add1 . add2 +3
-- result is 8
$
($) :: (a -> b) -> a -> b infixr 0
观察可知,$也是一种恒等映射,但是$操作符的优先级是最低的.故而可以用来分隔先后顺序,起到括号的作用
putStrLn (show (1 + 1))
putStrLn (show $ 1 + 1)
putStrLn $ show (1 + 1)
putStrLn $ show $ 1 + 1
和.的区别
+是一个二元运算,(1+1)是一个值,没有输入所以不能使用复合操作show输入一个Int返回一个String,putStrLn输入一个String,返回一个IO(),可以进行映射#复合
putStrLn . show $ 1 + 1