制作串联Haskell变体:应用程序和组合的优先级

制作串联Haskell变体:应用程序和组合的优先级,haskell,operator-precedence,concatenative-language,polish-notation,Haskell,Operator Precedence,Concatenative Language,Polish Notation,我正在学习连接语言的基础知识,其最初的想法是函数名连接与函数组合相同,而不是像Haskell那样作为函数应用程序 Joy、Forth或Factor是后缀,这意味着基于堆栈,但也有一些前缀连接语言,如Om 我想知道Haskell变体理论上是否可以仅仅通过将组合优先级(现在为9)与函数应用程序优先级(现在为10)交换(甚至相等)而成为级联语言 如果Haskell中的值只是零参数函数,为什么函数应用程序不同于函数组合?,函数应用程序不是与零参数函数组合相同吗 通过定义具有不同优先级的新组合运算符和应用

我正在学习连接语言的基础知识,其最初的想法是函数名连接与函数组合相同,而不是像Haskell那样作为函数应用程序

Joy、Forth或Factor是后缀,这意味着基于堆栈,但也有一些前缀连接语言,如Om

我想知道Haskell变体理论上是否可以仅仅通过将组合优先级(现在为9)与函数应用程序优先级(现在为10)交换(甚至相等)而成为级联语言

如果Haskell中的值只是零参数函数,为什么函数应用程序不同于函数组合?,函数应用程序不是与零参数函数组合相同吗

通过定义具有不同优先级的新组合运算符和应用程序运算符,并假设不带括号的简单串联为组合,是否可能以一种简单的方式制作一个解释器或预编译器,将串联语法转换为Haskell语法?。我认为这只是一个语法问题,我错了吗?这将避免在Haskell中使用括号或$operator的许多情况。或者这是一个更基本的问题,而不仅仅是语法和优先级

提示:假设Haskell中的每个函数和运算符都是前缀,我们可以在本练习中忘记中缀符号和各种“语法糖”

如果Haskell中的值只是常量函数,为什么函数应用程序不同于函数组合?,函数应用程序不是与常量函数组合相同吗

Haskell中的值不是“常量函数”。它们也不是“空函数”。Haskell中唯一的函数是那些类型包括函数arrow构造函数的函数

常量函数是给定任何输入,返回相同输出的函数

alwaysOne x = 1

map alwaysOne [1..5] == [1, 1, 1, 1, 1]
这样一个函数的导数是0。
const
函数通过忽略其第二个参数并始终返回第一个参数,方便地构造此类函数

map (const 1) [1..5] == [1, 1, 1, 1, 1]
“空函数”的概念只有在Haskell中函数可以接受多个参数的语言中才有意义,具有多个参数的函数的定义是具有一个参数的链式函数定义的语法糖,这一过程称为currying。所有这些定义都是等价的

foo x y = x + y

foo x = \y -> x + y

foo = \x -> \y -> x + y
(实际上,出于效率考虑,GHC的运行时处理多参数函数,并且只为部分应用的函数构造闭包对象。)

我认为这只是一个语法问题,我错了吗

级联语言的基本思想是,程序表示函数,而将两个程序串联起来,则会生成一个表示这些函数的组合的程序。因此,如果
f
是一个函数,而
g
是一个函数,那么
fg
是一个程序,它将我们在Haskell中编写的内容表示为
g。f
。在抽象代数术语中,存在从句法幺半群到语义幺半群的同态。这就是语法问题

然而,还有一个语义问题。这些函数必须操纵在它们之间隐式传递的程序状态,而实际程序的状态是复杂的,因此在实践中,连接语言倾向于使用表示值堆栈的元组,因为这在实际硬件中实现起来既简单又高效。理论上,程序状态可以是任何东西,比如地图或集合


我认为Haskell的语义是这里真正的绊脚石,虽然你可以在Haskell中嵌入连接DSL,但你需要一种连接语言才能使其用于日常编程。

我的问题的最佳答案是@Daniel Wagner在第二次评论中引用的文章,这是Sami Hangaslami写的,作为对@Jon Purdy的另一篇好文章的回答


它展示了“在Haskell内部实现级联DSL的一种方法”,这就是我真正想知道的,它是否可能,以及如何实现

Haskell中的值不仅仅是常量函数;它们根本不是函数,或者,如果你喜欢滥用你谈论这些事情的方式,它们充其量是零参数函数(对于这些函数来说,“常数”不是一个有意义的描述——常数大于什么,确切地说?)。另请参见,顺便提一下,这是谷歌“连接编程Haskell”的两大热门内容。@daniel wagner,你是对的,抱歉,零参数函数不是常量函数。因此,当第二个函数没有参数时,可以将函数应用程序视为函数组合。这种解释避免使用“值”和函数应用,一切都是函数和组合。这是连接方式,我想看看Haskell是否可以连接使用。Yor first reference是回答这个问题并在Haskell中实现连接语法的一个很好的尝试。谢谢。不是所有的值都是函数。递归不需要函数。谢谢@Jon(我读到了关于你的“小猫”:)。你说:“这些函数必须操纵在它们之间隐式传递的程序状态”,但我无法从中推断出状态的含义:“程序表示函数,连接两个程序会生成一个表示这些函数组成的程序”。没有(显式)状态的连接语法不可能吗?为什么?。使用单子或箭头编程是否接近于串联编程语法?(函数从上一个函数获取操作/状态,并将操作/状态传递给下一个函数)。@enrique:在堆栈语言中,每个函数都接受一个堆栈作为输入,并返回一个堆栈作为输出;实际上,该堆栈操作是就地完成的,因此堆栈表示