显示类型声明,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的点滴。
写得不好,多多包涵!