Ruby中有一个标识函数吗?

时间:2019-11-30 10:37:47

标签: ruby functional-programming

我目前正在编写一个Ruby类,该类提供基本lambda的菜单,这些菜单可以混合匹配以创建一组新的lambda。 (这是一种进化算法,需要根据数据集对适应度函数进行大量自定义)

发生这种情况的配置火灾中充满了这样的东西

function_from_modifier.(base_function, either.(modifier_from.(case),->(x){x}) )

身份功能->(x){x}在配置文件中多次弹出,而且看起来很丑,所以我想知道是否有更优雅的方法。像Elixir的&(&1)可以在Ruby中使用吗?

2 个答案:

答案 0 :(得分:4)

tl; dr 摘要:Ruby核心或标准库中没有标识功能。实际上,在核心库或标准库中的任何地方,根本没有功能(就预定义的Proc实例而言)

Ruby中的一等函数是第二类(如果有意义的话)。

当Yukihiro“ matz” Matsumoto最初设计Ruby时,他调查了其他语言的标准库,以供一等和更高阶函数使用,他发现绝大多数用途是:

  • 单个函数参数
  • 未存储,传递或返回的
  • 只能立即被调用一次或多次

不是为真的高阶函数的很大一部分是控制结构(例如,if需要一个条件和两个结果),但是他想建模为-语言构造,而不是库函数。

因此,他决定针对他发现的常见情况优化Ruby,并创建了 blocks

不是一流的功能:

  • 他们不是对象
  • 您无法向他们发送消息
  • 它们不能存储在变量中
  • 他们无法退回
  • 它们不能自由地作为参数传递,您最多只能传递一个参数,并且只能在参数列表中的特殊位置传递

因此, real (在某种意义上说它们是实际的对象)与块相比,第一级函数(Proc s)在某种意义上是第二级语言功能:

  • 它们的内存成本更高
  • 打电话给他们比较慢
  • 在语法上创建起来比较麻烦

因此,从本质上讲,尝试以自己的方式使用Ruby时遇到限制是不足为奇的:这不是Ruby的目的。

过去,我经常随身携带一个像这样的常量的帮助器库:

class Proc
  Id = -> x { x }
end

但是我停止这样做了。如果要使用Ruby,请使用Ruby作为OO语言,如果要使用高级FP,请使用Haskell或Scala或Clojure或Racket或…

答案 1 :(得分:3)

中没有捕获匿名函数,因为在OOP中,有一些对象在其上定义了方法,而不是函数。

最相似的调用是Object#itself,尽管人们可能会用method(:itself)而不是->(x) { x },但由于许多原因,它并不完全相同。

为什么不只将匿名函数分配给变量并使用它,例如λ = ->(x) { x },然后在各处使用λ

侧注:使用裸函数而不是对either的调用中的代码块对我来说似乎是一个糟糕的设计。块速度更快,在这种情况下,核心库中的任何地方都使用块。