haskell学习笔记(1)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值