haskell学习笔记(1)

来源:互联网 发布:菲律宾跳水队 知乎 编辑:程序博客网 时间:2024/05/29 09:00

haskell里不区分语句和表达式,即所有语句都有值
例如
(if x > 100 then x else x*2) + 1
就是将if语句的返回值加上1
(常规来说,语句就是不返回值的表达式,但是现在也有很多语言不区分语句和表达式了(例如kotlin),很多区分的语言基本上都是受了C的影响(例如java),其实这两者并没有必要分开来)


haskell的let和js的let一样,都是为变量限定局部作用域,即变量作用域和声明位置无关,默认是全局的,只有加上let才会收缩到最小代码块。(其他语言基本上是作用域和声明位置默认有关的,例如C java)


haskell的集合表达式可以说是他最强的特性之一了,和python的列表推导类似,但远远强过后者。haskell的集合表达式语法基本上和数学上的集合表达式相同,所以描绘集合的能力非常强。

ghci> [x*2 | x <- [1..10]][2,4,6,8,10,12,14,16,18,20]ghci> [x*2 | x <- [1..10], x*2 >= 12][12,14,16,18,20]ghci> [ x | x <- [50..100], x `mod` 7 == 3][52,59,66,73,80,87,94]boomBangs xs = [ if x < 10 then "BOOM!" else "BANG!" | x <- xs, odd x]ghci> [ x*y | x <-[2,5,10], y <- [8,10,11], x*y > 50][55,80,100,110]ghci> let nouns = ["hobo","frog","pope"]ghci> let adjectives = ["lazy","grouchy","scheming"]ghci> [adjective ++ " " ++ noun | adjective <- adjectives, noun <- nouns]["lazy hobo","lazy frog","lazy pope","grouchy hobo","grouchy frog", "grouchy pope","scheming hobo","scheming frog","scheming pope"]

写一个函数,只保留字符串中的大写字母,如果是用其他语言,估计要写一个循环再加许多判断,可能还要各种连接复制,不过对于haskell的集合描述法来说就很简单了

remove str=[char|char<-str,char `elem` ['A'..'Z']]

remove首先声明了一个名为remove的函数,然后他的参数名为str,因为这种声明方法的语法和一些命令式语言里声明变量的方式很像,所以一开始会很不习惯
然后我们描述了一个集合,集合中的每个元素char都来自str字符串集合,然后char同时属于’A’..’Z’这个区间,[‘A’..’Z’]这种创建区间的语法也是很多语言里都有,(python,kotlin)

然后我们调用 remove "AbcD" 最后返回值为AD

如果对数学里集合描述法很清楚的话(高中内容),上面这段代码看上去应该非常熟悉,而且看上去非常清晰。


如何取得所有三边
长度皆为整数且小于等于 10,周长为 24 的直角三角形?
let fun=[(a,b,c)|a<-[1..10],b<-[1,a],c<-[1,b],a+b+c==24,a^2+b^2-c^2==0]


欢迎关注我的github https://github.com/luckyCatMiao