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
- Haskell学习笔记1
- haskell学习笔记(1)
- Haskell语言学习笔记(1)
- Haskell 学习笔记
- Haskell 学习笔记 1 --环境搭建与类型系统(Haskell Tutorial 1--Getting start with Haskell)
- Haskell笔记1
- haskell笔记(1)
- Haskell学习(1)
- Haskell学习1
- Haskell语言学习笔记(38)Lens(1)
- Haskell语言学习笔记(40)Arrow(1)
- Haskell语言学习笔记(41)Parsec(1)
- Haskell : Functionally Solving Problems 部分学习笔记
- Haskell语言学习笔记(2)
- Haskell语言学习笔记(4)Functor
- Haskell语言学习笔记(5)Applicative
- Haskell语言学习笔记(6)Monad
- Haskell语言学习笔记(8)Monoid
- Visual Studio的语言服务器协议
- 1003. Emergency (25)(floyd)
- 自动类型安全的REST .NET标准库refit
- 使用Windows兼容包简化向.NET Core的迁移
- hibernate配置文件
- haskell学习笔记(1)
- 页面呈现
- 单例模式浅谈
- 【BZOJ】3007 拯救小云公主 最短路径
- 线程池的原理及实现
- mongodb安装
- 数据库事务与锁详解
- 元素大小
- 关于python中的urllib中的字典变换