首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

从 Java 和 JavaScript 来学习 Haskell 和 Groovy(DSL)

前文已经介绍过了高阶函数的使用,但是在 Haskell 中,所有的函数都可以理解为,每次调用最多都接受一个参数,如果有多个参数怎么办?...把它化简为多次调用的嵌套,而非最后一次调用,都可视为高阶函数(返回函数函数)。...如果递归函数递归调用自己发生在最后一步,并且程序可以把这一步的入栈操作给优化掉,也就是最终可以使用常量栈空间的,那么就可以说这个程序/语言是支持尾递归的。 它有什么好处?...因为可以使用常量栈空间了,这就意味着再也没有递归深度的限制了。 不过话说回来,Haskell 是必须支持尾递归的。...听起来简单,但是只有 Haskell 是真正支持惰性求值的,其他的语言最多是在很局限的范围内,基于优化语言运行性能的目的,运行时部分采用惰性求值而已。

43010

C++、Python、Rust、Scala 构建编译器的差异性究竟有多大?

Haskell能力,导致他们的得分比选择其他语言的团队低得多,也有另一部分Haskell团队像我朋友那样做得非常完美。...在Python中只需要一个大约10行的函数即可递归地访问AST结点的各个域(通过__dict__属性)。 作为Rust和静态类型语言的爱好者,我需要指出,类型系统非常有助于避免bug和提高性能。...如果差异真的导致需要写两倍的代码,那我依然认为Rust的付出是值得的,两倍的差异的确不可忽视,我以后会考虑在独立完成某项工作中的一次性代码时使用Ruby或Python。 ?...他们的代码生成部分是3594行,我们的只有1560行。我看了他们的代码,似乎所有的差异都在于他们采用了一种中间数据结构来生成汇编指令,而我们使用了基本的字符串直接输出汇编代码。...他们依然要用Scala构建树,但他们整个分析阶段只用了1073行,而我们用了1443行,大部分采用LR分析的其他团队的代码量都比我们的递归下降分析更多。

1.3K40

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

reduce() 对每个后续项执行传递的函数,返回的是最终结果的内部累加;例如 reduce(lambda n,m:n*m, range(1,10)) 意味着“10 的阶乘”(换句话说,用每一项乘上前一次相乘的乘积...通过将这三种 FP 内置函数进行组合,可以执行惊人的一系列“流”操作(都不使用语句,而使用表达式)。  Python 中的函数循环替换循环与替换条件块一样简单。for 可以直接转换成 map()。...我们 的确仍然利用了实用程序函数 monadic_print(),这个函数是完全一般性的,可以在我们以后创建的每个函数程序表达式中重用(它是一次性成本)。...FP(特别是 Haskell)对于“不执行任何操作,在进程中有副作用”的函数具有“单一体”意思。 ...我发现通过语言 Haskell 比 Lisp/Scheme 更容易掌握函数编程(即使如果在 Emacs 中,后者可能使用得更广泛)。

87920

函数式编程很难,这正是你要学习它的原因

不错,你也许会偶然用到一两个函数式语言特征,例如block,人们不会去做函数式编程。   然而,很多年来,我们一直被教导说函数式编程语言很好很棒。...那些皈依函数式编程的人中,一直常见的考虑是:学习这种新的、函数式的语言对你有好处;就像是某些人建议说每天30分钟的健身房活动会让你的身体健康一样。这也同时暗示了这样做的难度和需要的付出。...有人说,大部分人第一次使用Haskell或Ocaml时都完全的不知所措。见鬼了,在Haskell里,连分号都跟别人不一样。...对我而言,我已经不惊奇于由于这样的思维而阻止他们学习函数式语言的现象;他们需要学习一种跟指针和递归一样基础的新概念。他们需要有一种只有专业人员在完成清晰的商业目标时才具有的耐心和斗志。...很少人能在过了可塑的年龄后还受得了一次一次的挫折,否则我们现在都早成专家了,不是吗?   还有更复杂的东西,有大量的语言和算法研究都是用函数式语言实施的(尤其是Haskell)。

99651

函数式编程那些事儿

Clojure,Common Lisp,Erlang,Haskell和Scala是遵循函数式编程方法的一些著名编程语言。...相反,函数式编程语言依赖于递归进行迭代。递归是使用递归函数实现的,递归函数会重复调用自己,直到达到基本情况为止。 引用透明性 一旦在函数式编程语言中定义了变量,就不允许在程序执行期间更改它们持有的值。...纯函数仅接受一次参数并产生不变的输出。因此,它们不会产生任何隐藏的输出。它们使用不可变的值,从而使调试和测试更加容易。 它的样式将函数视为值,并将其作为参数传递给其他函数。...缺点 不变的值与递归结合可能会导致性能下降 在某些情况下,编写纯函数会导致代码的可读性下降 尽管编写纯函数很容易,但是将其与应用程序的其余部分以及I / O操作结合起来很困难 以递归方式编写程序来代替使用循环...函数式编程风格的另一个重要语言是Haskell。Facebook在其反垃圾邮件系统中使用了它。甚至JavaScript(使用最广泛的编程语言之一)也喜欢使用函数式编程。

83140

铁定不纯的IO_Haskell笔记5

Haskell提供了do语句块,也是用来隔离不纯的部分的 一.I/O action 先看个函数类型: > :t print print :: Show a => a -> IO () print函数接受一个...getLine取一行输入,返回IO String,并通过<-运算符把String取出来,赋值给line变量,为空则什么都不做(返回IO (),结束),否则把该行内容通过putStrLn输出到标准输出并换行,并递归执行...另外,do语句块里的I/O Action会执行,所以do语句块有2个作用: 可以有多条语句,最后要返回I/O Action 圈定不纯的环境,I/O Action能够在这个环境执行 类比JS,组合多条语句的功能类似于逗号运算符...如果编译执行函数,会发现是逐行处理的: $ ./toUpperCase abc ABC efd EFD 这与输入缓冲区有关,具体见Haskell: How getContents works?...惰性I/O 字符串本身是一个惰性List,getContents也是惰性I/O,不会一次性读入内容放到内存中 toUpperCase'的示例中会一行一行读入再输出大写版本,因为在输出的时候才真正需要这些输入数据

1.3K30

2017最受欢迎人工智能编程语言:Python第一,R并未上榜

虽然你可以用任何语言编写这些算法,Haskell相比其他语言更具表现力,同时保持不错的性能。例如,Haskell写的faster cover trees 。...由于函数编程和静态,代码可以轻松地在云上的不同CPU上执行。行业采用方面,Facebook使用Haskell打击垃圾邮件。 6. JavaScript ?...AI开发者重视其预设计的搜索机制,非确定性,回溯机制,递归性质,高级抽象和模式匹配。 Prolog非常适合涉及结构化对象及其关系的问题。...该语言在计算机科学中引入了许多想法,如递归,动态类型,高级函数,自动内存管理,自主(self hosting)编译器和树结构(tree data structure)。...由于执行时间和OOP原则更快,C ++本身就是AI程序的好选择。事实上,大部分机器学习和深度学习库都是用C / C ++编写的,并提供相同语言的API和为其他编程语言提供封装。

2.3K60

基础语法_Haskell笔记1

语法格式 Haskell里的函数调用默认是前缀语法,例如: succ 2 min 1 (-2) 与Bash脚本的函数调用语法一样,函数名 参数1 参数2 运算符作为特殊的函数,默认要以中缀形式调用,...,要求左边是函数,右边是其参数 P.S.还有一个很有意思的东西:($ 2) sqrt,中缀函数柯里化的小把戏 柯里化 Haskell函数默认都是柯里化的,都接受一个参数: In Haskell, all...调用函数时会按声明顺序匹配参数类型,所以上面的sayOneTwoThree 2会返回"Not between 1 and 3" 再比如利用模式匹配递归求阶乘: fact 0 = 1 fact n =.../函数只对in部分可见 注意,同样要求多行声明要严格对齐,非要单行就用分号隔开 P.S.let-in的in部分可以省略,作用域扩展到当前函数/List Comprehension,如果是在GHCi环境,...,声明的变量/函数对其右侧限制条件和变量,以及竖线左侧部分可见。

1.8K30

Heskell与函数式编程

导语 :这个系列打算分为三部分,由浅入深地介绍所谓的函数式编程 1)Haskell入门 2)Monad介绍 3)函数式编程的思想 Haskell简介 Haskell诞生于1990年,是一门纯函数式编程语言...这里的写法非常清晰明了,循环价格的集合,找出其中大于20的价钱,打九折,然后加到价格总数里面,实际上计算器内部使用寄存器和跳转指令执行的流程也是相差无几,这就是用计算机执行的思维去写代码。...从这里可以看到,Haskell的基本处理单位是函数函数是一等公民),一个函数可以成为另外一个函数的输入,函数和数学范畴的映射是一样的。...这里简单的进行了一次 3+5的求和操作。 但是我们更加习惯于用编辑器进行编码,下面使用文本编辑器来写一段代码。 ?...这段代码定义了一个函数findMax,输入两个数字x和y,输出x和y的最大值,这里要注意下haskell内if else语句else是不可或缺的,不像JAVA可以写if不写else。

78370

深入理解函数式编程(上)

递归定义。λ项递归定义,M可以是一个λ项。 替换归约。λ项可应用,空格分隔表示对M应用N,N可以是一个λ项。...况且function定义的函数大多数还能被构造(比如new Array)。 接下来我们将研究箭头函数,因为它更像是数学意义上的函数(仅执行计算过程)。 没有arguments和this。...Composition 函数组合:将多个单函数进行组合,像流水线一样工作。 另外还有一些特性,有的会提到,有的一笔带过,实际也是一个特性(以Haskell为例)。...函数式编程不强调状态,大部分情况下,我们的“状态”就是一个函数的元(我们从元获取外部状态)。...这样可以让我们在运行时创建很多基础函数并不影响实际业务运行速度,唯有业务代码真实调用时才产生开销。 图 39 map(addOne)并不会真实执行+1,只有真实调用exec才执行

75030

一个函数的自白

且听一个函数的自白,从函数的角度看编程的方式。 我眼中的大环境——内存 空山不见人 闻人语响 代码最终都要加载到内存中执行,组成函数的代码同样如此。...幂等性: 若一个函数或过程是幂等的,对其进行多次调用将观察到同样的效果, 与一次调用的效果是相同的。...反射的目的是要求程序能自我修改,ruby支持完备反射,python 和javascript在限制条件下支持反射,而java支持小部分的反射。...所有的代码块都会检测可能存在的错误,当错误发生时,跳过代码块,设置合理的状态并继续执行函数的其他部分。...所有现代高级编程语言都有一个类型系统,在开发和执行过程中的不同节点检测数据类型。静态类型的语言如Java 和 Haskell,动态类型如JS,python等等。

74750

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

Haskell 中开发应用程序时,我们通常在一个窗格中打开一个带有文本编辑器的终端,然后在另一个窗格中打开 ghcid。...在开发过程中,除了紧密的反馈循环外,Haskell 代码还易于重构和修改。就像用其他任何语言编写的现实世界代码一样,用 Haskell 编写的代码也不会写一次就完事。...全面(测试各种输入)并提供良好的覆盖范围(测试大部分代码库)。 易于运行并快速完成,否则它们将不会成为开发流程的一部分。 与它们测试的代码同步更新和维护。 Haskell 的类型系统没有上述问题。...,如前面有关静态类型的部分所述。...在我们从事过的许多项目上我们做了很多工作,包括实现了作为服务于一个 HTTP API 的同一可执行文件的一部分运行的 websocket 服务器,还创建了一个多线程 worker 系统,其所需的开销远低于管理单个

1.3K10

从素数生成看Haskell的简洁性

核心函数就是sieve,大致处理过程是这样:读入一个列表,并取出第一个元素p。然后筛选出不能被p整除的剩余数字,递归求解。这里提及一下,[2..]是Haskell列表的一个神奇的特性,即支持无限列表。...这个Haskell的lazy特性有很大的关系。...的确,在处理诸如递归这种问题上,FP总是能用短小精悍的代码在众多语言中脱颖而出。...这段代码也是Haskell简洁性的高度体现。其中,tail想到与后移整个数列,之后通过zipWith函数的处理将两个数列相加,以此来达到F(n)=F(n-1)+F(n-2)的效果。...虽然说这样高度精简的代码由于不直观,并不太适合在实际的项目中使用,况且其他语言的稍长的代码甚至可能在效率上更优,这仍不影响Haskell表现其独有的简洁及优雅的魅力。

29110

精读《深度学习 - 函数式之美》

然而在生产环境中,基于 性能和安全性 的考虑,一般会使用函数式语言 Clojure 或 Haskell。 在生产环境中,可能要并发出里几百万个参数,因此面临的挑战是:如何高效、安全的执行这些运算。..., Haskell 可以几乎原汁原味的还原函数定义过程: solve :: Int -> Interger solve 1 = 1 solve 2 = 9 solve 3 = 16 solve n =...的无限数组,而 zip 函数将其整合为一个新数组 (1,2),(2,4),(3,6),(4,8)... 这也是无限数组,如果将 zip 函数执行完那么程序就会永远执行下去。... Haskell 却不会陷入死循环,而是直接输出第一位数字 1。...这就是惰性计算的特性,无论数组有多长,只有真正用到某项时才对其进行计算,所以哪怕初始数据量或计算量很大,实际消耗的运算资源取决于这次计算实际用到的部分

38910

如何掌握程序语言

他们却没有注意到,绝大部分最新的概念其实都可以用最简单的那些概念组合而成。而对基本概念的一知半解,导致了他们看不清那些复杂概念的实质。比如这些概念里面很重要的一个就是递归。...国内很多学生对递归的理解停留于汉诺塔这样的程序,而对递归的效率也有很大的误解,认为递归没有循环来得高效。而其实递归比循环表达能力强很多,而且效率几乎一样。...语言负责描述一个程序,而程序运行的速度,其实绝大部分不取决于语言。它主要取决于 1)算法和2)编译器的质量。编译器和语言基本是两码事。...所以学习逻辑式语言最好是从函数式语言开始,在理解了递归,模式匹配等基本的函数式编程技巧之后再来看 Prolog,就会发现逻辑式编程简单了很多。 从何开始 可是学习编程总要从某种语言开始。...就我的观点,首先可以从 Scheme 入门,然后学习一些 Haskell (但不是全部),之后其它的也就触类旁通了。你并不需要学习它们的所有细枝末节,而只需要学习最精华的部分

1.1K90

各种编程语言对尾递归的支持

,简单起见,考虑非负整数,后面叙述具体语言总是会以这个函数为例子。...所有的return部分都是不再依赖于递归,或者是返回Add函数,其参数的计算不再依赖于递归,典型的尾递归。   ...这里,可以采用一个编译技术,就是尾递归优化,其一般情况是,如果一个函数的计算中遇到了完全转化成另一个函数调用的情况,那么栈的当前函数部分的信息可以完全抹去,而替换为新的函数。...这个并非我们想要的,我们得用其他手段去验证(其实我们可以抽出部分优化选项来,此处讲的是验证思路)。   ...Haskell不亏是号称纯函数式编程,尾递归优化无条件支持。 Prolog   本不想测prolog,因为首先它并没有所谓的函数,靠的是谓词演化来计算,推理上的优化是其基本需求。

2.6K20
领券