我正在学习串联语言的基础知识,其最初的想法是函数名串联与函数组合相同,而不是像Haskell那样是函数应用程序。
Joy、Forth或Factor是postfix,这意味着基于堆栈,但也有一些前缀级联语言,如OM。
我想知道Haskell变体在理论上是否可以通过交换(甚至相等)组合优先级(现在9)和函数应用优先级(现在10)而成为一种串联语言。
如果Haskell中的值只是零参数函数,为什么函数应用程序不同于函数组合?函数应用程序不是和用零参数函数组合一样吗?。
是否可以通过定义具有不同优先级的新组合运算符和应用程序运算符,并假定没有括号的简单串联是组合,以一种简单的方式使解释器或预编译器将串联语法转换为Haskell语法?。我认为这只是一个语法问题,我错了吗?,这将避免许多在Haskell中必须使用括号或$运算符的情况。还是一个更根本的问题,不仅仅是语法和优先级?
提示:假设Haskell中的每个函数和运算符都是前缀,我们可以忘记这篇关于中缀表示法和各种“句法糖”的练习。
如果Haskell中的值只是常量函数,为什么函数应用程序和函数组合不同?函数应用程序和用常量函数组合不是一样吗?。
Haskell中的值不是“常量函数”。它们也不是“空元函数”。Haskell中唯一的函数是那些类型包含函数箭头构造函数->
的函数。
常数函数是给定任何输入,返回相同输出的函数。
alwaysOne x = 1
map alwaysOne [1..5] == [1, 1, 1, 1, 1]
map (const 1) [1..5] == [1, 1, 1, 1, 1]
foo x y = x + y
foo x = \y -> x + y
foo = \x -> \y -> x + y
我想这只是句法的问题,我错了吗?
级联语言的基本思想是,程序表示函数,将两个程序级联起来就会得到一个表示这些函数组合的程序。因此,如果f
是一个函数,g
是一个函数,那么fg
是一个程序,它表示我们将在Haskell中编写的内容为g。f
。在抽象代数术语中,从句法么半群到语义么半群之间存在一个同态。这就是语法的问题。
然而,还有一个语义问题。这些函数必须操纵它们之间隐式传递的程序状态,而实际程序的状态是复杂的--因此在实践中,级联语言倾向于使用表示值堆栈的元组,因为这在实际硬件中实现简单有效。理论上,程序状态可以是任何东西,例如映射或集合。
我认为Haskell的语义是这里真正的绊脚石,虽然您可以将串联DSL嵌入到Haskell,但您需要一种串联语言才能使其用于日常编程。
我发现优先级和关联性是一个很大的障碍,让我理解语法在haskell代码中试图表达的内容。 例如, 通过实验,我终于明白了, 你们谁能提供一些参考,让语法更容易掌握吗?
问题内容: 像这样的组合器优先吗? (注之间的空间,并为后代组合子) 还是从左到右阅读,就像 ? 问题答案: 不,在组合器中没有优先级的概念。但是,在复杂的选择器中存在元素顺序的概念。 可以从对您有意义的任何方向读取任何复杂的选择器,但这并不意味着组合器是分布式的或可交换的,因为它们表示两个元素(例如和)之间的关系。这就是为什么元素顺序很重要的原因。 但是,根据Google的说法,浏览器实现了其选
我看到了一些关于函数组合和应用程序之间的异同以及各种实现方法的问题,但有一件事开始让我有点困惑(据我搜索,还没有人问过这个问题)是关于性能的差异。 当我学习F#时,我爱上了管道操作符,它在Haskell的反向应用程序中具有等效性。但在我看来,F#变体无疑更漂亮(我不认为我是唯一一个)。 现在,可以很容易地将管道操作符黑客攻击到Haskell中: 管道(在F#和我们的haskell技巧中)之间的最大
最近,我在Stackoverflow中问了一个关于从图构建DFS树的问题,并了解到它可以通过使用状态单子简单地实现。 haskell中的DFS 虽然DFS要求仅跟踪访问的节点,以便我们可以使用“设置”或“列表”或某种线性数据结构来跟踪访问的节点,但BFS需要“访问的节点”和“队列”数据结构来完成。 我的BFS伪代码是 从伪代码中可以推断,我们每次迭代只需要做3个过程。 从队列中取出点 将该点的所有
首先,我对Haskell很陌生,目前我只是在努力准备考试。我有这样的表达式: 为例,得到的是一个错误。因为space运算符的优先级(10)比运算符(9)大,上面的表达式等效于,这是,这是reverse和list之间的组合,没有意义,对吗?我正在努力确保我做对了,我真的没有在互联网上找到类似的东西。
主要内容:总结本节我们从一个例子入手讲解,请看下面的代码: 运行结果: d=24, e=8 1) 对于表达式 ,如果按照数学规则推导,应该先计算乘法,再计算加法; 的结果为 8, 的结果为 24,所以 d 最终的值也是 24。从运行结果可以看出,我们的推论得到了证实,C语言也是先计算乘法再计算加法,和数学中的规则一样。 先计算乘法后计算加法,说明乘法运算符的优先级比加法运算符的优先级高。 所谓优先级,就是当多个