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

当我们谈论Monad的时候(二)

而作为过渡,我选择了Haskell来代替Java进行说明。本篇文章默认读者已经对Haskell的基本语法有所了解,因此对此类内容我不会再做赘述。...Do-notation Do表记(do-notation)是Haskell给Monad操作提供的语法糖。在不使用Do表记情况下,使用Monad的代码是相当混乱的。...不过,这也只解释了为什么如今Haskell的Applicative和Monad是这种状态。那么,是什么原因使Haskell冒着把标准库搞乱的风险也要引入Applicative呢?...至于这个定律是什么,在讲原理的文章中我会详细说明。...不过这样的好处是,我在下一篇可以讲更多有意思的Monad了,说不定还能讲讲Arrow Type和Monad,为更后面的范畴论做些预备。

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

    基础语法_Haskell笔记1

    非函数式思维:通过命令告诉电脑要做什么,比如求和是通过循环结构遍历所有的数,相加并记录其和 函数式思维:通过函数来描述出问题是什么,比如求和是把第一个数与其余树的和相加 P.S.关于思维模式的差异,请查看一场函数式思维模式的洗礼...),都是左结合的(infixl的l表示left associative),函数签名也相同(Num a => a -> a -> a) 优先级的范围是0-9,值越大越优先 三.函数调用 语法格式 Haskell...语法格式如下: 反斜线 + 参数列表 -> 函数体 例如: sum' = \x y -> x + y P.S.类似于JS的const sum = (x, y) => x + y 从应用场景来看,lambda...参数列表后面多了| 条件表示不同的函数体分支,被调用时满足条件就执行对应函数体并返回,否则就按顺序依次向下检查 注意,最后的otherwise比较有意思,因为: > :i otherwise otherwise...length' xs = sum [ 1 | _ <- xs ] P.S.其中_表示占位符,不关心其值是什么,算一种地道的编码习惯 另外,List Comprehension是可以嵌套的: -- 滤掉二维数组中的奇数

    1.9K30

    你觉得“惰性求值”在 JS 中会怎么实现?

    接上一篇《听君一席话,如听一席话,解释解释“惰性求值”~》,有掘友问:“我懂惰性求值的意思了,但是在 JS 中如何实现 thunk 的呢?”...JS 不像 Haskell,其自身从语言设计层面不支持惰性求值,但是可以通过语法去 模拟实现 这一特性; 想一想,我们可以用什么来 JS 语法来模拟这一“延迟计算”的特性?...---- 那意思是用 Promise 模拟吗? 事实上,不行!...Haskell 中的无限列表不就是 MDN 中 Generator 所实现的 无限迭代器 吗?...以实现 take 方法为例: 在 Haskell 中,take 函数可以从头连续地取得一个列表的几个元素; Prelude> take 3 [1,2,3,4,5] [1,2,3] JS 模拟实现 take

    1.5K20

    前50个Python面试问题(最受欢迎)

    #3)说明列表,元组,集合和字典,并至少提供一个可以使用这些集合类型中的每一个的实例。 回答: 列表:可以在运行时更改的不同数据类型的项目的集合。 元组:不能更改的不同数据类型的项目的集合。...它与列表有什么不同? 答案:元组基本上是由逗号分隔并括在括号中的元素序列。 列出,而是由逗号分隔并括在方括号中的一系列元素。同样,元组不能更新,而在列表中,元素及其大小可以更新。...它具有简单易用的语法,对于初次尝试学习计算机编程的人来说,它是理想的语言。 #32)Python中的成员运算符是什么?写一个例子来解释两者。...dir()显示作为参数传递的对象的属性列表。如果dir()不带参数,则它将返回当前本地空间中的名称列表。 #38)“Monkey Patching”在Python中是什么意思?...#39)在Python中,“套房”是什么意思? 答:一组单独的语句,从而使逻辑代码块称为套件 例: 如果表达套件其他套件 #40)Python中的range()是什么?举例说明一下。

    5.1K30

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

    虽然 Haskell 确实内容非常丰富,包含许多使用其他语言的程序员可能不熟悉的概念和语法,但它在开发人员生产力、代码可维护性、软件可靠性和所提供的性能方面却无与伦比。...这意味着 SQL 程序倾向于描述其执行结果应该是什么,而不是这个结果如何实现。熟悉 SQL 的开发人员都能想得到,以命令式方式编写代码来检索表中存储为一系列行的数据会非常麻烦。...Haskell 中支持 DSL 的函数之一称为 Template Haskell。很多库作者经常使用这个方法,以允许库的使用者使用表达性语法来避免大量样板。...它公开了一种 DSL,其使用所谓的持久性实体语法,允许库的用户定义其数据库模式。下面是这种语法的示例。...,如果你从未使用过 Haskell 的 Persistent 库,很可能你从未见过这种语法。

    1.4K10

    从素数生成看Haskell的简洁性

    最近有空就在看Haskell,真是越看越觉得这个语言有意思。在知乎(原回答@阅千人而惜知己的)找到了一份很有意思的求素数代码,非常简洁,我觉得很能体现这个语言的特点。...核心函数就是sieve,大致处理过程是这样:读入一个列表,并取出第一个元素p。然后筛选出不能被p整除的剩余数字,递归求解。这里提及一下,[2..]是Haskell列表的一个神奇的特性,即支持无限列表。...这个Haskell的lazy特性有很大的关系。...那么,如果是放在同样具有列表解析的Python中,又能怎么写呢?...虽然说这样高度精简的代码由于不直观,并不太适合在实际的项目中使用,况且其他语言的稍长的代码甚至可能在效率上更优,但这仍不影响Haskell表现其独有的简洁及优雅的魅力。

    33710

    为何 Go 的声明语法有点怪?(语法比较)

    这里我们比较一下 C,Go,Haskell 三者的语法,可以看到其实语言的语法其实都是服务于自己的设计目标的。...Haskell 语法 Haskell 作为一门纯函数式编程语言,大部分人可能听过,但是接触过、学习过的人应该不会太大,毕竟平常工作用不到,我也只是简单的了解过,里面的一些函数式理念对于写出更复用的函数有很强的启发作用...Haskell 的语法是与自身为纯函数式的编程语言分不开的,Haskell 不使用括号这种具有边界性质的符号来界定参数,而是使用 -> 开放形式来声明,返回值与入参一样,都是用-> 串起来的,使得声明看起来非常的一致...函数式里面有一个术语叫柯里化,柯里化后的函数可以一次只接收一个参数,每次返回一个新的函数,直到所有的参数都满足了,才会触发计算返回最终值,而 Haskell 里的函数默认是全部柯里化的,譬如我们想过滤出列表里所有偶数...回过头来我们再看一下 Haskell 的函数声明语法a -> b -> c,其实这里面没有什么入参、返回值的区别,函数从左到右接收参数,返回值就是最后参数后面的部分,也就是说我们提供了一个参数a,返回就是

    1.7K40

    常见编程语言对REPL支持情况小结

    Ruby 官方实现就带REPL,只是命令是irb,意思是Interactive Ruby Shell,而不是ruby。exit(),quit()命令都可以退出。...原生不带REPL的语言 JavaScript 类似JavaScript这种量级的脚本语言本来应该都是有REPL的,可是JavaScript是个一般在浏览器中运行的语言,所以有些特殊了。...有意思的是该实现竟然是通过Python来安装的… JAVA JAVA作为传统的静态类型语言,本身是不带REPL环境的,但是有BeanShell。...这种分享代码片段的方式比snipplr和github gist这种单纯贴代码的方式要更为先进一些.支持的语言如下: C C++ D Haskell Lua OCaml PHP Perl...Plain Text Python Ruby Scheme Tcl WIKI的列表 WIKI的列表也挺详细的:http://en.wikipedia.org/wiki/Read%E2%80%

    1.6K40

    一周极客热文:十步完全理解SQL

    SQL 的语法并不按照语法顺序执行 SQL 语言的核心是对表的引用(table references) 灵活引用表能使 SQL 语句变得更强大 SQL 语句中推荐使用表连接——记着要尽量使用 JOIN...进行表的连接,永远不要在 FROM 后面使用逗号连接表。...HelloWorld的字节码 执行这个程序,Java文件首先编译为java字节码储存在.class文件里。 字节码是什么样子的呢? 麻雀虽小,五脏俱全。...②你应该订阅Linux内核邮件列表,然后努力去理解。③如果你不去编写针对Linux内核的代码,你就是在浪费时间。...《MacTalk人生元编程》——By 池建强随笔文集 【小道消息】作者冯大辉作序 《Linux/UNIX系统编程手册》——本书号称超越APUE的一本经典书 《Haskell趣学指南》——传说中提到的所有

    1.1K80

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

    比如:let result1 = longCalculation1(a,b); 这个表达式,意思是把 longCalculation1(a,b) 计算的返回值赋给 result1; 在惰性求值中,赋值时...第一节示例的 JavaScript 的代码虽然是有惰性求值的思想体现,但是其本身并不是惰性求值; 惰性求值是编程语言的特性设计,很多纯粹的函数式编程语言都支持这种设计; 比如在 Haskell 中实现上述示例...有点像 Promise 的意思,你不告诉我 resolve/reject,我就 pending;Haskell 中,你不告诉我什么时候调用这个值,我就维持 thunk 的状态; 无限列表 在 Haskell...不断递增的数组; 为什么在 Haskell 中行,在 JavaScript 中不行?...因为它是懒惰的,你定义归你定义,反正定义的时候,我又不用分配无穷大的内存,等你开始调用的时候,我再开始计算分配吧! 延迟计算很棒,不过事物都有两面性,这样做坏处是什么?

    66120

    Haskell

    ghc包含了三个主最要的部分: ghc 编译器 ghci 交互式解析器和调试器 runghc 以脚本的方式运行Haskell 而我们即将学习的起点就是在ghci中来练习Haskell的基本语法。...Haskell每一个函数都非常颗粒度,来解决很小的问题,如果我们无法理解这种很小的颗粒度,根本很难从小组合到强大的处理流程。是的,这就是Haskell。...这个项目,有趣的地方在于很多审计需要符合科学与哲学,它要解决的问题很像是比特币+以太坊,很有意思的是它通过民主投票的方式来解决分歧,我很喜欢这个特性,我们持有的Cardano代币,就能让我们进行投票,并且这不是损耗...(注明:本文不是投资建议,仅仅是从Haskell引发出来的Cardano项目) 是的,Cardano就是用Haskell来编写的,(我这样的渣渣也仅仅是阅读和学习)Haskell的用户大部分都是教授或者是数学领域的牛人...回归语言Haskell,函数式的编程其实有一点上,大家都很清楚,用很少的代码来完成一件事情。Haskell还可以定义跟数学的过程一一对应,这就很有意思了。

    88330

    通过欧拉计划学习Rust编程语言

    看了一下网上有关Rust的介绍,都说它的学习曲线相当陡峭,曾一度被其吓着,后来发现Rust借鉴了Haskell等函数式编程语言的优点,而我以前专门学习过Haskell,经过一段时间的入门学习,我现在已经喜欢上这门神奇的语言...,你可以用任何办法去解决它,当然主要还得靠编程,但编程语言不限,已经有Java、C#、Python、Lisp、Haskell等各种解法,当然直接用google搜索答案就没意思了。...学习Rust最好先把基本的语法和特性看过一遍,然后就可以动手解题了,解题的过程就是学习、试错、再学习、掌握和巩固的过程,学习进度会大大加快。...学过Python的列表推导(List Comprehension)语法的感觉这种题完全可以用一行语句搞定,Rust中需要用到filter()和sum()函数。...-> bool,让我想起了Haskell的语法。

    1.1K30

    Python笔记(第三章)

    《元组》 什么是元组,元组的理解成一个不可进行更改的列表,换个理解方式,如列表申请的元素,可以看见并进行修改等一定的高级操作,但是元组不一样它更像申请了一张可视的图片,可以观测元素,但不能对其更改。...) >>> number [1, 2, 3, 4, 5, 6, 7] 发现不同的地方了吗,没错,就是元组的申请方式与列表的申请方式不一样,主要在包含元素的操作符上,在大部分的申请方式中区别元组与列表的方式...,只要是看:创建元组用的是小括号,创建列表用的是中括号。...有同学疑惑了,这元组的类型还是动态的,带动态变化的啊,这个问题看下面不带小括号会怎样 >>> apple = 1,2,3,4 >>> apple (1, 2, 3, 4) >>> type(apple)...,不是小括号,难道是逗号吗,没错。

    29220

    SQL命令 SELECT(二)

    选择项由下列一个或多个项组成,多个项之间用逗号分隔: 列名(字段名),带或不带表名别名: SELECT Name,Age FROM Sample.Person 字段名不区分大小写。...要显示RowID(记录ID),可以使用%ID伪字段变量别名,该别名显示RowID,而不管它被分配的名称是什么。...因为返回的数据是列表格式的,所以可能需要使用$LISTTOSTRING或$LISTGET函数来显示数据。...括号中的子句是可选的。 PARTITION BY partfield:可选子句,根据指定的partfield对行进行分区。 部分字段可以是单个字段,也可以是用逗号分隔的字段列表。...ORDER BY orderfield:可选子句,根据指定的orderfield对行进行排序。 Orderfield可以是单个字段,也可以是逗号分隔的字段列表。

    1.9K10
    领券