Haskell 趣学指南 入门笔记(二)

时间:2021-11-05 12:42:07

显示类型声明,Haskell是不用定义类型的原因,很像python

想要确定某个表达式的类型

 *Main> :t 'a'
'a' :: Char
*Main> :t True
True :: Bool
*Main> :t "HELLo"
"HELLo" :: [Char]

可以用:t 显示

所以当我们定义一个函数时,可以加上类型声明。

body.hs函数

addthree::Int -> Int ->Int -> Int
addthree x y z =x+y+z
fac::Integer -> Integer
fac n= product [..n]
*Main> fac

Integer自带 高精度,内存大多,就能表示多大的数。。

类型类

Eq类

*Main> 'a'=='a'
True
*Main> /=
True
*Main>

Ord类 比较大小类。还有其他一些类

函数语法---模式匹配

类似c++Switch case

sayMe::Int-> String
sayMe ="One!"
sayMe ="Two!"
sayMe ="Three!"
sayMe ="Four!"
sayMe ="Five!"
sayMe x="Not between 1 and 5!"

调用

*Main> :l body
[ of ] Compiling Main ( body.hs, interpreted )
Ok, modules loaded: Main.
*Main> sayMe
"Five!"

自己写head函数

 head' :: [a]->a
head' []=error "Can call head on an empty list,dummy!"
head' (x:_)=x

As模式没看懂怎么回事,大概是自己调用自己??、

 firstletter :: String->String
firstletter ""="Empty string,whoops!"
firstletter all@(x:xs)="The first letter of" ++ all ++ " is " ++[x] *Main> firstletter "Dracula"
"The first letter ofDracula is D"
*Main>

哨卫,又好像case语句

 bkm:: Double->String
bkm bmi
| bmi<=18.5="1!"
| bmi<=25.0="2!"
| bmi<=30.0="3!"
| otherwise=">3" *Main> bkm 19.9
"2!"

where 关键字
 避免重复计算一个值

 bkm:: Double->Double->String
bkm weight height
| bmi<=skinny="1!"
| bmi<=normal="2!"
| bmi<=fat="3!"
| otherwise=">3!"
where bmi=weight/height^
skinny=18.5
normal=25.0
fat=30.0

模块内的代码注意对其,类似python

let语句:绑定语句在前,后面跟表达式

 *Main> (let a=;b=;c= in a*b*c,let foo="Hey";bar="there!" in foo++bar)
(,"Heythere!")

居然也有Case 表达式。。

好玩点的递归啊!

原来这里快速排序可以这样写,好简洁

 quicksort [] =[]
quicksort (x:xs)=
let small=[a|a<-xs,a<=x]
lager=[a|a<-xs,a>x]
in quicksort small++ [x] Prelude> :l body
[ of ] Compiling Main ( body.hs, interpreted )
Ok, modules loaded: Main.
*Main> quicksort [,,,,,,,,]
[,,,,,,,,]

虽然这个快排是这原始的那种吧,本身可能会有点问题,因为每次都是选择列表第一个元素,但是的确简洁啊

这篇博客主要计入自己开始入门Haskell的点滴。

写得不好,多多包涵!