0%

Start to learn Haskell 03

郁闷

今天周六,公司附近基本上没有卖早餐的,不过今天看起来似乎比较幸运,竟然神奇的多了一家卖早鸡蛋灌饼的在地铁附近。为了早晨不挨饿就买了一个,但是不知道为什么,在去公司的路上我就一直感觉不太对,也一直在考虑只要再看到有一家卖早点的,我就把这个灌饼给丢掉。但是今天是周六嘛,我没有幸运的看到第二家卖早点的,只好将就一下了。
事情的发展是这样的,10点半吃完,到11点前就感觉不太对,我以为那是因为我还喝了格瓦斯,11点多出去抽烟,感觉更难受了,然后就去了厕所,先是拉肚子,然后出来又开始吐。中午吃饭时也感觉没有胃口,平时一碗面对我来说还略嫌不够,不过今天吃了连三分之一都不到就吃不下了,吃饭回来又接着吐。在拉肚子的时候任何一个屁都不值得相信,为了安全起见,又进了厕所,果然又是拉肚子,然后下午就由两个同事陪同去了医院急诊,拿了药回到家接着吐,然后睡觉,现在总算是好一些了。
这期间还有,从下午回来我就发现王爷是在家的,但是一直到我晚上起床都没听到他的动静,就打了电话给他,原来他老人家上吐下泄到今天凌晨4点,我勒个去的。
哦,还有,中日友好医院急诊内科的那个年轻女大夫很漂亮。

Haskell变量类型

基本类型

在Haskell中一切都是有类型的,如字符Char字符列表[Char]元组(Int, Bool),数值类型有IntInteger,其中Int受系统位数影响,比如64位系统,这种类型的范围就是-2-2…^63到2^63-1Integer类型则非常大,可以尝试一下product [1..50]

函数类型

前面说到,Haskell的函数也是有类型的,在在hci中输入:t getChar,返回是getChar :: IO Char,其含义是getChar*这个函数返回一个Char类型数据(这个地方不太会解释)。
由于Haskell可以推断类型,很多情况下似乎可以不用特意声明类型,但是为了使程序更易读并易于编译器检查,我们还是应该在定义函数时,在函数前加上函数类型,如下:

1
2
3
4
byThree :: Int -> Bool
byThree x = if x `mod` 3 == 0
then True
else False

例子中,第一行声明byThree这个函数接受一个Int型参数,返回一个Bool型值。

类型变量

记得在前两天刚开始学Haskell时,学到一个函数maximum [1,2,3,4,2,5],这个函数接受一个列表做为参数,返回列表中最大的元素,来看一下这个函数的类型,:t maximum,返回为maximum :: [a] -> a,哦,这是什么意思哪?是说这个函数接受一个a类型列表返回一个a类型数值吗?是的,不过在这里a不特指某一类型,而是可以为Char也可以是Int更可以是别的什么,这是一个变量,在这里就叫类型变量了,而使用类型变量指代参数类型的函数就可以叫做多态函数,这跟C++或Java的泛型有些相似。

当然,a既然只是一个变量,那我们也可以用其它名字代替,比如b

还记得前面学元组时学到的两个函数吧fstsnd,看一下:t fst,返回fst :: (a,b) -> a,其含义就是fst函数接受一个元组为参数,这个元组的第一个元素为a类型,第二个元素为b类型,该函数返回的数据类型与第一个元素相同,因为本函数返回的就是元组的第一个元素。再查看一下:t snd,返回snd :: (a,b) -> b,其含义就显而易见了。

结尾

今天身体不舒服,就写到这里吧,现在已经11点28了,马上休息,希望明天身体装备能完全恢复,今天就暂停一天的学习,明天可以多学一些进行补偿。
另外,希望王爷的身体也尽快恢复健康。

Welcome to my other publishing channels