enr*_*que 5 haskell operator-precedence concatenative-language polish-notation
我正在学习连接语言的基础知识,其最初的想法是函数名称连接与函数组合相同,而不是像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]
Run Code Online (Sandbox Code Playgroud)
这样一个函数的导数是0. const函数通过忽略它的第二个参数并总是返回第一个参数来方便地构造这样的函数.
map (const 1) [1..5] == [1, 1, 1, 1, 1]
Run Code Online (Sandbox Code Playgroud)
"nullary函数"的概念仅在函数可能采用多个参数的语言中才有意义 - 在Haskell中,具有多个参数的函数的定义是用于定义具有一个参数的链式函数的语法糖,在称为currying的过程中.所有这些定义都是等价的.
foo x y = x + y
foo x = \y -> x + y
foo = \x -> \y -> x + y
Run Code Online (Sandbox Code Playgroud)
(实际上,出于效率原因,GHC的运行时处理多参数函数,并且只为部分应用的函数构造闭包对象.)
我认为这只是语法问题,我错了吗?
连接语言的基本思想是程序表示函数,并且连接两个程序为您提供表示这些函数组成的程序.因此,如果f是一个函数,并且g是一个函数,那么它f g是一个程序,表示我们将在Haskell中编写的内容g . f.在抽象代数术语中,存在从句法幺半群到语义幺半群的同态.这是语法问题.
但是,还存在语义问题.这些函数必须操纵在它们之间隐式传递的程序状态,并且实际程序的状态很复杂 - 所以在实践中,连接语言倾向于使用表示一堆值的元组,因为这在实际中实现简单有效硬件.理论上,程序状态可以是任何东西,例如地图或集合.
我认为Haskell的语义是这里真正的绊脚石,虽然你可以将连接的DSL 嵌入到Haskell中,但是你需要一种连接语言才能使它可用于日常编程.
我的问题的最佳答案是 @Daniel Wagner 在他的第二条评论中引用的文章,“Haskell 中的串联行多态编程”,该文章由 Sami Hangaslammi 撰写,作为 @Jon Purdy 的另一篇好文章的答案,“为什么串联编程很重要”。
它展示了“在 Haskell 中实现串联 DSL 的一种方法”,这正是我真正想知道是否可能以及如何实现的。