ruby - 在 ruby​​ 中实现 iota

标签 ruby programming-languages functional-programming scheme combinators

对于再次提出这个问题,我提前表示歉意。我之前就 Haskell 实现问过这个问题 here ,但我仍然很难理解它是如何工作的。另外,我发现简约编程语言的概念绝对令人着迷,并且无法摆脱它......无论如何,这不是一个可以怀念函数式编程之美的地方。

那么!我找到了一个关于深奥编程语言的网站,并发现了 Iota。 Iota 可以说是最小的函数式语言。您可以在这里阅读更多相关信息:"Iota and Jot: the simplest languages?"以下是Scheme中Iota的引用实现:

(let iota ()
   (if (eq? #\* (read-char)) ((iota)(iota))
       (lambda (c) ((c (lambda (x) (lambda (y) (lambda (z) ((x z)(y z))))))
                    (lambda (x) (lambda (y) x))))))

但是,当我尝试与 Ruby 中的 Scheme 实现等效的优雅方法时,它最终会抛出一个“错误的过程”。谁能帮我理解为什么 Ruby 会这样,以及如何更好地实现它。在尝试使其正常工作时,为了便于阅读,我将 SKBASIS 分开。

我在底部添加了两个测试。第一个应该返回 I (BASIS[BASIS]),但它返回的过程不会产生与 I 相同的结果。第二个测试应该返回 K,但它却返回错误。

S = lambda {|f| lambda {|g| lambda {|x| f[x][g[x]] }}}
K = lambda {|x| lambda {|y| x }}
BASIS = lambda {|c| c[S][K] }

iota = lambda{|s|
   s = s.chars
   i = lambda {
      if s.next == '*'
         i[i]
      else
         BASIS
      end
   }
}

p BASIS[BASIS][1]         # => 1
p iota["*ii"][1]          # => #<Proc:0x000000010016b290>

p K[1][2]                 # => 1
p iota["*i*i*ii"][1][2]   # => line 3:in `[]': can't convert Proc into Integer (TypeError)

最佳答案

在第 9 行,您正在调用 i[i] ,但是i不接受任何参数 - 仅接受 i 返回的 lambda做。所以你应该调用i不带任何参数,然后调用调用 i 的结果与 i作为其参数,即 i[][i] .

关于ruby - 在 ruby​​ 中实现 iota,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12219120/

相关文章:

ruby-on-rails - Rails activeadmin 自定义 View 和关联

ruby - 这种使用案例陈述的做法是不好的吗?

programming-languages - 最适合程序员的键盘布局?

Javascript 对象/函数问题

python - Python脚本中数组数据转换的设计模式

Ruby代码美化,将长指令拆分成多行

ruby-on-rails - Rails Join 不显示相关表中的字段

oop - 为什么 oop 语言没有 'read only' 访问修饰符?

c++ - 在构造函数中初始化数组。

Javascript - 将嵌套数组转换为数组对象