f . g $ 3与3 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演算的核心至关重要,任何其他排列方法都会与语言交互不良.
lef*_*out 11
3 g ff $ g $ 3f . g $ 3.通常,您不只是链接"原子"函数.当然,你没有处理全球命名的单字母函数,所以微小的.或者$并没有真正在冗长方面产生显着差异.正如嗯说的那样,你经常链接部分应用的函数,例如
main = interact $ unlines . take 10 . filter ((>20) . length) . lines
Run Code Online (Sandbox Code Playgroud)
没有廉价的紧密绑定应用程序,这会更麻烦.此外,分离.标记未立即应用但仅仅是组合的内容是非常自然的.