为什么选择函数应用程序作为默认的Haskell运算符,而不是组合?

Rum*_*mca 8 haskell

f . g $ 33 g f面向堆栈的语言相比,Haskell语法需要相对嘈杂.这个选择的主要设计论点是什么?

rmm*_*mmh 12

那也可以写f (g 3).

为什么Haskell不是连接语言?

基于Haskell的历史,它受到各种函数式编程和懒惰语言实验的影响,包括ML.如第4节所述,语法描述:

哗众取宠

遵循回归弗雷格的传统,两个参数的函数可以表示为一个参数的函数,该参数本身返回一个参数的函数.摩西施fonfinkel和Haskell Curry磨练了这一传统,后来被称为currying.函数应用程序由并置表示并与左侧相关联.因此,f x y被解析(f x) y.这导致简洁而强大的代码.例如,要对我们编写map square [1,2,3]的列表中的每个数字求平方,同时将我们编写的列表列表中的每个数字对齐map (map square) [[1,2],[3]].像许多其他基于lambda演算的语言一样,Haskell支持curried和uncurried定义,

currying的概念对Haskell的语义和lambda演算的核心至关重要,任何其他排列方法都会与语言交互不良.

  • 据我所知,甚至没有讨论以任何其他方式做到这一点.鉴于Haskell的祖先,他们的选择是显而易见的. (2认同)

lef*_*out 11

  1. 面向堆栈的风格并不像序列函数那样构成 ; 是这样的语言而不是Haskell.当然,这相当于,但它只有在您立即将组合应用于某个值时才有效.在Haskell中,您经常编写函数只是为了将它们交给某些更高阶的组合子,或者进行无点定义.在面向堆栈的语言中,需要某种显式块,在Haskell中它只需要运算符.3 g ff $ g $ 3f . g $ 3.
  2. 通常,您不只是链接"原子"函数.当然,你没有处理全球命名的单字母函数,所以微小的.或者$并没有真正在冗长方面产生显着差异.正如嗯说的那样,你经常链接部分应用的函数,例如

    main = interact $ unlines . take 10 . filter ((>20) . length) . lines
    
    Run Code Online (Sandbox Code Playgroud)

    没有廉价的紧密绑定应用程序,这会更麻烦.此外,分离.标记未立即应用但仅仅是组合的内容是非常自然的.