首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

基础语法_Haskell笔记1

same infix expression 二元运算符和一元运算符不能混用在同一个中缀表达式里,这会带来解析时的不确定性(有歧义,编译器不知道怎样理解)。...所以,经验原则是给所有负数字面量都带上括号,(-3) P.S.Haskell只有一个一元运算符,就是一元减号-,具体见Unary operator 逻辑运算 3个运算符:与(&&),或(||),非(not...区别是目的不同,偏函数应用是为了减少函数所需参数数量(通过固定一些参数值),柯里化是为了把一个多参函数转换成单参函数,这个单参函数返回一个单参函数(参数数量不足),或者求值(参数数量够了) 四.函数声明...参数列表后面多了| 条件表示不同的函数体分支,被调用时满足条件就执行对应函数返回,否则就按顺序依次向下检查 注意,最后的otherwise比较有意思,因为: > :i otherwise otherwise...用expression依次尝试匹配pattern,匹配成功就执行对应的代码块返回结果,否则尝试下一个,都不匹配就报错 P.S.同样,作为表达式,case-of可以用于任何地方,比模式匹配灵活得多(模式匹配只能用于函数声明

1.8K30

热爱函数式的你,句句纯正的 Haskell【表达式篇】

if..then..else 表达式,isTwo 是一个函数,n 是入参;可以看到,Haskell 的表达式并没有像在 JS 中的括号进行包裹; 当然,你也可以写像 JS 中的等号运算符; Prelude...:Hskell 里的 if..then..else 的 else 后的表达式不可省略; 也就是说,必须定义条件成立的时候返回的值,也必须定义条件不成立的时候返回的值,并且两者返回的类型必须相同,这样一定程度上保证了函数定义的完整性...,满足条件立即跳出; 不过 JS 实现责任链要进行封装,Haskell 直接原生语法就支持,| 就是对 if..then..else 的封装; 运算符 前文已提到:加号、减号,这些本质和函数是一样的,...:表示从一个列表中取出第 n 个元素( 0 开始) Prelude> [1,2,3,4,5]!!...、$ ; 这些都是为后面揭开 Haskell 函数式编程神秘面纱的基础,期间也能一窥这种把函数当计算的奇妙之处,即使不能在开发生产中用到 Haskell,对于平常的编程思考也是大有裨益的,希望你有受用到

1.1K30
您找到你想要的搜索结果了吗?
是的
没有找到

铁定不纯的IO_Haskell笔记5

写在前面 一直有个疑惑,Haskell号称纯函数式语言,那么铁定不纯的场景(肯定有副作用,或者操作本身就是副作用)如何解决?...Haskell的做法其实类似于React的componentDidMount()组件生命周期函数,React建议(道德约束)保持render()是纯函数,带有副作用的操作挪到componentDidMount...IO String,通过<-运算符把String取出来,赋值给line变量,为空则什么都不做(返回IO (),结束),否则把该行内容通过putStrLn输出到标准输出换行,递归执行main 其中,...放到do语句块里 在GHCi环境输入I/O Action再回车,putStrLn "hoho" 执行 可以把main当做普通函数在GHCi环境下执行,例如: > :l echo [1 of 1] Compiling...do,能够简化一些场景 return return用来把value包成I/O Action,而不是函数跳出。

1.3K30

为什么 Haskell 是我们构建生产软件系统的首选

例如,诸如 Int -> Int -> Bool 之类的签名表示函数接收两个整数返回一个布尔值。...我们要找一个函数,这个函数需要一个要搜索的项目、一个项目列表返回一个布尔值。我们不关心项目的类型,只要搜索项目和列表中的项目属于同一类型即可。...执行 I/O 操作的任何函数(例如查询数据库或接收 HTTP 请求)都必须具有捕获它的返回类型。...对于包含副作用的对比示例,FilePath -> IOString 的函数签名指示这个函数接收一个文件路径执行一个 I/O 操作,这个操作返回一个字符串(这正是 readFile 函数的作用)。...上述类型的一种应用场景可以是基于发票的状态创建一个通知消息的函数。这个函数将 CustomerInvoice 作为参数,返回一个表示通知内容的字符串。

1.3K10

解决 JavaScript 中处理 null 和 undefined 的麻烦事

换句话说,JavaScript 中的数组可以填补 Haskell 语言中 Maybe 的角色。 什么是Maybe? Maybe 是一种特殊的抽象数据类型,它封装了一个可选值。...你可以围绕 Maybe 建立一个有用函数的完整库去实现其他操作 flatMap 和 flat(在编写多个 Maybe 返回函数时,避免使用 Just(Just(value)) )。...,因此,如果你的函数可能会产生 null 或 undefined,则需要将其返回的数组中过滤掉。...在 Haskell 中,有一个函数maybe(类似 map)将一个函数应用于一个值。但是值是可选的,封装在 Maybe 中。...为了方便起见,我还定义了一个 toMaybeArray 函数添加了一个 maybe 函数来进行演示。

1.2K20

厌倦了空指针异常?考虑使用Java SE 8的Optional!

: "UNKNOWN"; 其他功能语言,Haskell和Scala,采取不同的视图。Haskell包括一个Maybe类型,它基本上封装了一个可选的值。...默认值和操作 典型的模式是返回默认值,如果确定操作的结果为空。一般来说,您可以使用三元运算符来实现: Soundcard soundcard = maybeSoundcard != null ?...要以安全的方式执行操作,您首先需要检查指向USB对象的引用是否为空,然后调用getVersion()方法,如下所示: USB usb = ...; if(usb !...使用流,flatMap方法将一个函数作为参数,返回一个流。功能应用于流的每个元素,这将导致流的流。然而,flatMap具有通过流的内容替换每个生成的流的效果。...其目的是将变换函数应用于一个值Optional(就像地图操作那样),然后将所得到的两个层次平坦Optional化为一个

1.3K31

Array.slice 8种不同用法

MDN文档,slice 是数组上的一个方法,它最多有两个参数: arr.slice([begin[, end]]) begin 索引处开始提取原数组中的元素,如果参数为负数,则表示原数组中的倒数第几个元素开始提取...一种情况是希望弹出数组的第一个元素使用它,返回剩余的数组,但希望在不修改原始数组的情况下执行操作。...当有两个参数时,slice方法返回一个begin开始但不包括end的集合。...一些类似数组包arguments(用于访问传递给函数的所有参数的关键字),NodeLists(返回节点列表的任何DOM API方法返回),甚至是使用数字索引添加length属性的原始对象。...虽然像Haskell这样的纯函数语言本身支持偏函数应用程序,但是在JavaScript中,我们可以使用slice实现一个函数来实现它 var partial = function() { const

1.1K30

Array.slice 8种不同用法

MDN文档,slice 是数组上的一个方法,它最多有两个参数: arr.slice([begin[, end]]) begin 索引处开始提取原数组中的元素,如果参数为负数,则表示原数组中的倒数第几个元素开始提取...一种情况是希望弹出数组的第一个元素使用它,返回剩余的数组,但希望在不修改原始数组的情况下执行操作。...当有两个参数时,slice方法返回一个begin开始但不包括end的集合。...一些类似数组包arguments(用于访问传递给函数的所有参数的关键字),NodeLists(返回节点列表的任何DOM API方法返回),甚至是使用数字索引添加length属性的原始对象。...相反,可以将slice与扩展运算符一起使用,以返回一个相同但对于要更新的​​索引的新数组: function replaceIdx(arr, index, newVal) { return [

74920

可爱的 Python:Python 中的函数编程

一个函数只是我们在 Python 中对其执行某些操作的另一个值。  我们对第一类对象所执行的主要操作是将它们传递给 FP 内置函数 map()、reduce() 和 filter()。...这些函数中的每一个都接受函数对象作为其第一个自变量。  map() 对指定列表中每个对应的项执行传递的函数返回结果列表。...FP(特别是 Haskell)对于“不执行任何操作,在进程中有副作用”的函数具有“单一体”意思。 ...组成各对的数字本身是另外两个列表中挑选出的。这种操作与程序员在他们程序段中实际执行操作差不多。实现这一目的的命令方法如下:  清单 7....您可以逐步建立一个 Singleton 类来包含这种类型的不可变绑定(例如 s.bigmuls );但本专栏并不涉及这一内容。

88920

热爱函数式的你,句句纯正的 Haskell函数篇】

Haskell 值与函数是统一的,函数只是需要其他参数输入的值。如果定义的是函数,那么这个函数的行为在运行过程中也是不会改变的,对于某一个特定的输入返回的结果总是确定的,这样的函数为纯函数。...再三强调,在 Haskell 中,函数与值没有本质的区别,它可以是单一的定值,也可以是任意两个函数间的映射; 实际上,在 Haskell 世界里,所有的运算符号都可以被看做是函数加号 + 是一个需要两个参数的函数...Prelude> f3 x y z=3*x+2*y-z Prelude> f3 1 2 3 4 Prelude> :t f3 f3 :: Num a => a -> a -> a -> a 我们惊人的发现,定义方式...λ表达式 Haskell 还有另外一种书写函数的格式,即 λ 表达式; // 定义方式 3 函数名= (\参数1 -> \参数2 -> ......] \x -> 2*x+7 是一个没有名字的匿名函数,在 Haskell 中,通常用 λ 表达式来构造匿名函数; 阶段小结 小结中,我们再来回归三种定义函数的方式: // 方式 1: f2(x,y)=

32610

【工作基础】软件工程师的知识基础(持续更新)

当使用new来分配内存时,会调用定义的operator new函数,它会输出分配的内存大小返回分配的内存地址;当使用delete来释放内存时,会调用定义的operator delete函数,它会输出相应的提示信息释放内存...它包含了一系列的函数、系统调用、库函数和数据结构,用于实现各种系统级的操作文件操作、进程管理、网络通信。...常见的 Linux API 包括 POSIX 标准定义的接口、系统调用( open、read、write )、网络套接字 API( socket、bind、listen )、进程管理 API(...\n"); return 0; } 程序使用了几个Linux API函数: open():用于打开或创建一个文件,返回一个文件描述符(file descriptor),如果出错则返回-1。...在关系型数据库中,常见的事务操作包括: 开始事务(BEGIN TRANSACTION) 提交事务(COMMIT) 回滚事务(ROLLBACK) 下面是一个简单的示例,展示了如何使用事务来执行一系列数据库操作

4000

Python魔术方法-Magic Method

__new__是用来创建类返回这个类的实例, 而__init__只是将传入的参数来初始化实例。 在对象生命周期调用结束时,__del__ 方法会被调用,可以将__del__理解为“构析函数”。...__setitem__(self, key, value): 当你执行self[key] = value时,调用的是方法。...一个列子 下面是书中的例子,用魔术方法来实现Haskell语言中的一个数据结构。...Magic method explain __pos__(self) 实现一个取正数的操作 __neg__(self) 实现一个取负数的操作 __abs__(self) 实现一个内建的abs()函数的行为...实现真实除法 __mod__(self, other) 实现一个“%”操作符代表的取模操作 __divmod__(self, other) 实现一个内建函数divmod() __pow__ 实现一个指数操作

82860

听君一席话,听一席话,解释解释“惰性求值”~

,先不对 longCalculation1(a,b) 进行计算,而是 result1 被取用的时候(在示例中,就是 return的时候)再进行计算。...然后在真正需要计算g x的时候才会调用这个thunk; 事实上这个thunk里面还包含一个boolean表示thunk是否已经被计算过(若已经被计算过,则还包含一个返回值),用来防止重复计算;...第一节示例的 JavaScript 的代码虽然是有惰性求值的思想体现,但是其本身并不是惰性求值; 惰性求值是编程语言的特性设计,很多纯粹的函数式编程语言都支持这种设计; 比如在 Haskell 中实现上述示例...;也就是说,所有单独的数字都同时在内存中,因为只有在 + 操作执行时,才会调用值去计算; 所以,惰性计算带来的最大麻烦就是:内存泄露; 内存泄露 → 剩余内存不足 → 后续申请不到足够内存 →内存溢出;...(思路:强制求值第一个参数,返回第二个参数;) 函数式语言和命令式语言的内存模型; 懒惰奥义 听君一席话,听一席话,希望看完本篇后,有人再问你“什么是惰性求值”,能心里有个基本的谱~~ 人天性爱偷懒

57720

10个惊艳的Swift单行代码

几年前,一篇表述“10个Scala函数式单行代码”的文章非常受欢迎,并且随后立马出现了其他的语言版本,例如Haskell版本,Ruby版本,Groovy版本,Clojure版本,Python版本,C#版本...,F#版本,CoffeeScript版本。...2 数组中的元素求和 虽然这里使用reduce和加号运算符,借助了加号运算符函数这样一个事实,但解决办法是显而易见的,我们可以看到 reduce更具创意的用法。 ?...我们在这里构建了包含两个分区的结果元组,一次一个元素,使用过滤函数测试初始序列中的每个元素,根据过滤结果追加元素到第一或第二分区数组中。...9 并行处理 某些语言允许用一种简单和透明的方式启用数组对功能,例如map和flatMap的并行处理,以加快顺序和独立操作执行

1.3K20

Linq基础知识小记二

"扩展方法",核心是扩展方法,因为where、OrderBy、Select扩展方法返回都是一个IEnumerable类型对象,所以配合扩展方法本身的特殊性(不懂,请参考C# this关键字(给底层类库扩展成员方法...Select:按照Lambda制定的规则决定了当前数据集合要以怎样的方式输出. (3)、方法语法中除了Select、OrderBy、Where的其它查询操作符 并不是所有的查询运算符返回一个IEnumerable...System.Linq.Enumerable类 2、Linq查询表达式语法 Linq查询表达式语法写出的查询比较类似与Sql语句,是C#3.0加入的,虽然Linq查询表达式看上去类似于Sql查询,但实际上它并不是建立在Sql语句上,而是建立在函数式编程语言...LISP和Haskell中的list comprehensions(列表解析)功能之上,也就是所编译器会对Linq查询表达式进行处理,编译成扩展方法,实质也是在使用扩展方法进行查询....上图是标准的查询表达式语法图 3、组合查询语法 因为查询表达式语法和扩展方法语法各有所长,其实本质上查询表达式编译之后也是一种方法语法,两者是真包含的关系,所以使用起来可以根据自身的喜好来决定,但是当一个查询操作运算符没有对应的查询表达式语法时

1.3K70

MySQL技能完整学习列表3、SQL语言基础——3、SQL运算符函数

SQL运算符函数 MySQL的SQL运算符函数是数据库查询和操作的重要组成部分。它们用于执行各种任务,包括数据检索、转换、比较和计算。 一、SQL运算符: 算数运算符:用于执行数值计算。...主要用于对二进制数进行操作位与、位或、位异或和位非。...这些函数可以在查询中直接使用,返回所需的结果。...以下是一些常用的函数分类: 字符串函数 CONCAT(), UPPER(), LOWER(), TRIM(), SUBSTRING(), LENGTH() ,用于对字符串进行操作。...例如:sql SELECT CAST(age AS CHAR) FROM users; 将age字段数值转换为字符类型 条件函数 `IF()`, `CASE`, `COALESCE()` ,用于根据条件返回

13310

Epic 新语言 Verse 介绍

(下一节详述) IsEqual() : void = { … } not 运算符操作对象 not expression or 运算符的左操作对象 expression1...直观来看,能更好地将错误处理融入到正常的程序执行过程中,但这似乎也使得我们很难在一个地方统一处理错误,语言提供的统一操作只有 option 用于表示一个值有没有,具体这个方案能力是否足够可能还需要再多使用后再做评价...事务化能力 # 在上一节中,我们了解到 Verse 语言有一个可失败上下文的概念,了解到带有 说明符的函数函数体也是一个可失败上下文。... 表示函数执行的任何操作都可以回滚。...: 图片 因为 sync 代码块会等待所有表达式的执行结果,因此其返回值为一个包含代码块中每个表达式返回值的 tuple。

86930

再谈编程范式—程序语言背后的思想

每个对象有其自身的内部状态,以及管理自身状态的可执行子程序 Declarative—说明式||声明式 *函数式 Lisp ML Haskell ,程序被看作是一种输入到输出的函数 *数据流...编程的发展史来谈面向对象的出现。当软件还非常简单的时候,我们只需要面向过程编程: 定义函数 函数函数函数函数四 定义数据 数据一 数据二 数据三 数据四 最后各种函数,数据的操作。...这些对象一起协作,最后完成一个传统成千上万行的过程式代码才能完成的功能。例如现在要连接sql server执行查询语句取得结果返回。...理论上说,函数式语言也不是通过冯诺伊曼体系结构的机器上运行的,而是通过λ演算来运行的,就是通过变量替换的方式进行,变量替换为其值或表达式,函数也替换为其表达式,根据运算符进行计算。...不可变性:前面一提到,不修改变量,返回一个新的值。 由于变量值是不可变的,对于值的操作并不是修改原来的值,而是修改新产生的值,原来的值保持不便。

1.6K20

前端系列第8集-Javascript系列

new 操作符是 JavaScript 中用来创建对象的一种机制,它可以实例化一个构造函数返回构造函数创建的对象实例。...常见的函数式编程语言有 Haskell、Clojure、Erlang 。 优点: 可读性强:函数式编程中函数的参数和返回值具有明确的含义,易于理解和维护。...上传第一个获取服务器响应:将第一个块上传到服务器,等待服务器返回响应,以便确定它是否成功接收了返回已经上传的字节数。...unshift(): 在数组开头添加一个或多个元素,返回新数组的长度。 splice(): 指定位置开始删除/插入元素,可以实现数组的增删改查操作。...filter(): 过滤数组中的元素,返回一个新的数组。 map(): 遍历数组中的元素,对每个元素执行指定的函数返回一个新的数组。

18710
领券