在函数式编程中什么是无意义的风格?

我最近注意到的一个短语是“免费”风格的概念…

首先是这个问题, 也是这个问题。

然后,我在这里发现他们提到“另一个可能值得讨论的话题是作者不喜欢自由式的风格。

什么是“免费”的风格? 有人能给出一个简洁的解释吗? 它与“自动”咖喱有关吗?

为了了解我的水平 – 我一直在教自己的Scheme,并写了一个简单的Scheme解释器…我明白什么是“隐式”currying,但我不知道任何Haskell或ML。

只要看维基百科的文章来得到你的定义:

默认编程(point-free programming)是一种编程范式,其中函数定义不包含关于其参数的信息,使用组合器和函数组合来代替variables。

哈斯克尔例子:

常规(您明确指定参数):

sum (x:xs) = x + (sum xs) sum [] = 0 

无点( sum没有任何明确的参数 – 这只是一个+从0开始的折叠):

  sum = foldr (+) 0 

甚至更简单:而不是g(x) = f(x) ,你可以写g = f

所以是的:这与咖喱(或者function组合等操作)密切相关。

无点式意味着被定义函数的参数没有被明确提及,函数是通过函数组合来定义的。

如果你有两个function,比如

 square :: a -> a square x = x*x inc :: a -> a inc x = x+1 

如果你想把这两个函数合并成一个计算x*x+1函数,你可以这样定义它:“point-full”

 f :: a -> a fx = inc (square x) 

没有意义的select就是不要谈论参数x

 f :: a -> a f = inc . square 

点自由风格意味着代码没有明确提及它的参数,即使它们存在并正在被使用。

这在Haskell中起作用是因为函数的工作方式。

例如:

 myTake = take 

返回一个带有一个参数的函数,因此没有理由显式键入参数,除非你也想。

一个JavaScript示例:

 //not pointfree cause we receive args var initials = function(name) { return name.split(' ').map(compose(toUpperCase, head)).join('. '); }; //pointfree var initials = compose(join('. '), map(compose(toUpperCase, head)), split(' ')); initials("hunter stockton thompson"); // 'HS T' 

参考