Ruby 中有身份函数吗?

Tim*_*o Y 4 ruby functional-programming

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

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

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

->(x){x}配置文件中多次弹出identity函数,看起来很丑,所以想知道有没有更优雅的方法。像 Elixir 这样的东西&(&1)在 Ruby 中是可能的吗?

Jör*_*tag 5

tl;dr总结:Ruby 核心或标准库中没有标识函数。事实上,不存在的功能(在预先定义的意义Proc的实例)在所有在核心或标准库的任何地方。

Ruby 中的一等函数有点像二等函数(如果有道理的话)。

Yukihiro "matz" Matsumoto 在第一次设计 Ruby 时,他调查了其他语言的标准库,用于一等和高阶函数的用途,他发现绝大多数用途是:

  • 单个函数参数
  • 未存储、传递或返回的
  • 仅立即调用一次或多次

高阶功能的显著部分,其中,这是正确的控制结构(例如,if这需要一个条件,两成方面的后果),然而他要模拟内置的语言结构,而不是库函数。

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

不是一流的功能:

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

因此,与块相比,真正的(从某种意义上说它们是实际对象)一等函数(Procs)在某种意义上是二等语言特征:

  • 它们在内存中更昂贵
  • 打电话给他们比较慢
  • 它们在语法上创建起来更麻烦

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

过去,我曾经随身携带一个带有如下常量的辅助库:

class Proc
  Id = -> x { x }
end
Run Code Online (Sandbox Code Playgroud)

但我停止这样做了。如果我想用 Ruby,我就用 Ruby 作为面向对象的语言,如果我想做花哨的 FP,我用 Haskell 或 Scala 或 Clojure 或 Racket 或……