HashKell

编程环境

基本操作

ghci
Prelude> 2+2
Prelude> True && False

不等于

Prelude> 1/=2
True
if (5 /= 4) then "got it" else "oh no"
Prelude> let name = "cxk"
Prelude> name
"cxk"
Prelude> ["1","2"]
["1","2"]

列表中的项必须是相同类型

列举

Prelude> [1..10]
[1,2,3,4,5,6,7,8,9,10]

列表相加

Prelude> [1..5] ++ [6..10]
[1,2,3,4,5,6,7,8,9,10]

增加元素到列表头

Prelude> 1 : [2..5]
[1,2,3,4,5]
Prelude> :type 'a'
'a' :: Char

第一个Haskell程序

main = putStrLn "hello world"
runghc Helloworld.hs

类型系统

函数与类型不可分离

一些常用类型

(1,"cxk")
:type (18, "cxk")

定义类型

data Person = Person String Int -- 定义一个新类型,= 后面的Person是构造函数
let man = Person "cxk" 1
type Age = Int
data Name = String String | String
let name = Name "c" "xk"
let name1 = Name "cxk"
data Color = Red | Blue | Yellow
:type Red -- Red :: Color

参数化类型

-- 定义一个带有泛型a参数的类型
data Optional a = Just a | Nothing

函数

-- 调用compare函数 参数分别为1,2
compare 1 2
-- 嵌套调用
sqrt (sqrt 81)
:type sqrt
-- sqrt :: Floating a => a -> a

纯度

我们将带副作用的函数称为“不纯(impure)函数”,而将不带副作用的函数称为“纯(pure)函数”。

add :: (Int, Int) -> Int
add (x,y) = x+y

非柯里化函数:当函数有多个参数,必须通过元组一次性传入,染回返回结果

当函数有多个参数时,参数可以一个一个地依次输入,如果参数不足,将返回一个函数作为结果,这样的函数就是柯里化的函数。

if age <= 18 then "cxk" else "jntm"
-- 需要注意两个分支的返回值都需要是同类型
isOdd (1+2)
-- 1+2只有在真正需要时,才会被计算
:type last
-- last :: [a] -> a
-- 输入一个列表,这个列表的元素类型为a,返回一个类型为a的元素

软件的大部分风险,都来自于与外部世界进行交互

模式匹配

-- Haskell 允许将函数定义为一系列等式
-- 执行函数时,会逐个进行匹配
myNot True = False
myNot False = True