在函数式编程中什么是无意义的风格?
我最近注意到的一个短语是“免费”风格的概念…
首先是这个问题, 也是这个问题。
然后,我在这里发现他们提到“另一个可能值得讨论的话题是作者不喜欢自由式的风格。
什么是“免费”的风格? 有人能给出一个简洁的解释吗? 它与“自动”咖喱有关吗?
为了了解我的水平 – 我一直在教自己的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'
参考