码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-11-30 17:45:54      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:

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

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

1 *Main> :t a
2 a :: Char
3 *Main> :t True
4 True :: Bool
5 *Main> :t "HELLo"
6 "HELLo" :: [Char]

可以用:t 显示

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

body.hs函数

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

 

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

 

类型类

Eq类

*Main> a==a
True
*Main> 5/=6
True
*Main> 

 

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

函数语法---模式匹配

类似c++Switch case

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

调用

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

 

自己写head函数

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

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

1 firstletter :: String->String
2 firstletter ""="Empty string,whoops!"
3 firstletter all@(x:xs)="The first letter of" ++ all ++ " is " ++[x]
4 
5 
6 *Main> firstletter "Dracula"
7 "The first letter ofDracula is D"
8 *Main> 


哨卫,又好像case语句

 1 bkm:: Double->String
 2 bkm bmi
 3   | bmi<=18.5="1!"
 4   | bmi<=25.0="2!"
 5   | bmi<=30.0="3!"
 6   | otherwise=">3"
 7 
 8 
 9 *Main> bkm 19.9
10 "2!"

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

 1 bkm:: Double->Double->String
 2 bkm weight height
 3   | bmi<=skinny="1!"
 4   | bmi<=normal="2!"
 5   | bmi<=fat="3!"
 6   | otherwise=">3!"
 7   where bmi=weight/height^2
 8         skinny=18.5
 9         normal=25.0
10         fat=30.0

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

 

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

1 *Main> (let a=100;b=200;c=300 in a*b*c,let foo="Hey";bar="there!" in foo++bar)
2 (6000000,"Heythere!")

 

居然也有Case 表达式。。

 

好玩点的递归啊!

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

 

 1 quicksort [] =[]
 2 quicksort (x:xs)=
 3    let small=[a|a<-xs,a<=x]
 4        lager=[a|a<-xs,a>x]
 5    in quicksort small++ [x]
 6 
 7 Prelude> :l body
 8 [1 of 1] Compiling Main             ( body.hs, interpreted )
 9 Ok, modules loaded: Main.
10 *Main> quicksort [1,2,3,4,5,6,9,7,8]
11 [1,2,3,4,5,6,7,8,9]

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

 

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

写得不好,多多包涵!

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

标签:

原文地址:http://www.cnblogs.com/blankvoid/p/5007293.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!