haskell基础 - kscarrot/blog GitHub Wiki

布尔类型

Data.Bool

:t True
:t False
:t otherwise -- True的别名 语义需要

布尔常用方法

  1. (&&) :: Bool -> Bool -> Bool infixr 3
  2. (||) :: Bool -> Bool -> Bool infixr 2
  3. not :: Bool -> Bool

字符类型

Data.Char ASCII码会直接打印,其他字符会被转成对应的Unicode显示

数值类型

  1. 有符号整数Int,和操作系统位数有关
  2. 无符号整数Word,和操作系统位数有关
  3. 任意精度整数Integer 加上0b,0o,0x等前缀可以展示对应进制的整数(注:二进制需要增加BinaryLiterals拓展)
  4. 小数与有理数类型Float,Double,Rational 有理数可以被处理成任意精度整数的除法

列表类型

Data.List

[]包括用,并且只包括单一类型

:t  [1,True] -- 直接报错
:t  [1,1.2]  -- 可以,返回Num类型

字符串

Data.String

> ['H','e','l','l','0']
"Hello" -- String的类型为[Char]

type String = [Char]

元组类型

Data.Tuple

()包裹,可以包含多个类型

  • 确认元组后不可伸缩
  • 确认元组后对应类型不可改变

元组常用方法

  1. fst :: (a, b) -> a
  2. snd :: (a, b) -> b
  3. curry :: ((a, b) -> c) -> a -> b -> c
  4. uncurry :: (a -> b -> c) -> (a, b) -> c
  5. swap :: (a, b) -> (b, a)

函数类型

Data.Function

一个简单的例子

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+1)是一个值,没有输入所以不能使用复合操作
  2. show 输入一个Int返回一个String,putStrLn输入一个String,返回一个IO(),可以进行映射#复合
putStrLn . show $ 1 + 1