什么是函数式编程中的点自由风格?

Pau*_*rth 87 scheme functional-programming coding-style pointfree

我最近注意到的一个短语是"无点"风格的概念......

首先,有这样的问题,也是这一个.

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

什么是"免费"风格?有人可以给出简明的解释吗?它与"自动"曲线有关吗?

为了了解我的水平 - 我一直在教自己Scheme,并编写了一个简单的Scheme解释器...我理解"隐含"currying是什么,但我不知道任何Haskell或ML.

Dar*_*rio 60

只需查看维基百科文章即可获得您的定义:

默认编程(无点编程)是一种编程范例,其中函数定义不包括有关其参数的信息,使用组合器和函数组合而不是变量.

Haskell示例:

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

sum (x:xs) = x + (sum xs)
sum [] = 0
Run Code Online (Sandbox Code Playgroud)

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

 sum = foldr (+) 0
Run Code Online (Sandbox Code Playgroud)

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

所以是的:它与currying(或函数组合等操作)密切相关.

  • 我真的不喜欢在编程时为变量/参数提出新名称.这是我喜欢无点风格的一个重要原因! (19认同)
  • 啊,我明白了!因此,您只需通过组合其他功能而不是声明参数来构建新功能......非常优雅! (8认同)
  • 它与Currying有什么关系? (2认同)
  • @kaleidic:因为没有变量名,你需要组合部分应用的函数。这就是我们所说的柯里化(或者,更准确地说,通过柯里化使之成为可能) (2认同)

sth*_*sth 29

无点样式意味着未明确提及所定义函数的参数,该函数是通过函数组合定义的.

如果你有两个功能,比如

square :: a -> a
square x = x*x

inc :: a -> a
inc x = x+1
Run Code Online (Sandbox Code Playgroud)

如果你想将这两个函数组合成一个计算的函数x*x+1,你可以将它定义为"point-full",如下所示:

f :: a -> a
f x = inc (square x)
Run Code Online (Sandbox Code Playgroud)

无点替代方案不是谈论这个论点x:

f :: a -> a
f = inc . square
Run Code Online (Sandbox Code Playgroud)

  • 愚蠢的是,在Haskell中,"无点"方式通常是看起来更有意义(更多时期)的方式.这种烦恼是一个很好的助记符.(Real World Haskell一书就此发表评论.) (18认同)
  • 关于@ Dan的评论,[Pointfree](http://www.haskell.org/haskellwiki/Pointfree#But_pointfree_has_more_points.21)HaskellWiki页面解释了为什么它被称为_pointfree_. (3认同)
  • @Dan:我不认为这是愚蠢的,因为Haskell点意味着"那个圈子操作员"(看起来应该更像是°).但令人困惑的是,特别是当你不熟悉函数式编程语言时; 关于haskell的每本介绍书都应该解释无点样式. (2认同)

Bru*_*nno 10

一个JavaScript示例:

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

const compose = (...fns) => (...args) => fns.reduceRight((res, fn) => [fn.call(null, ...res)], args)[0];
const join = m => m.join();

//pointfree
var initials = compose(join('. '), map(compose(toUpperCase, head)), split(' '));

initials("hunter stockton thompson");
// 'H. S. T'
Run Code Online (Sandbox Code Playgroud)

参考


Ray*_*yne 7

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

由于函数的工作方式,这在 Haskell 中有效。

例如:

myTake = take
Run Code Online (Sandbox Code Playgroud)

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