【问题标题】:Implementing iota in ruby在 ruby​​ 中实现 iota
【发布时间】:2012-08-26 11:52:00
【问题描述】:

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

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

(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 实现等效的东西时,它最终会吐出一个“坏 proc”。谁能帮我理解为什么 Ruby 会这样,以及如何更好地实现它。在尝试使其正常工作时,我将 SKBASIS 分开只是为了便于阅读。

我在底部包含了两个测试。第一个应该返回I (BASIS[BASIS]),但它返回的proc 不会产生与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)

【问题讨论】:

    标签: ruby programming-languages functional-programming scheme combinators


    【解决方案1】:

    在第 9 行,您调用了 i[i],但 i 不接受任何参数 - 只有 i 返回的 lambda 接受。所以你应该不带参数调用i,然后调用i的结果,以i作为参数,即i[][i]

    【讨论】:

    • 谢谢,正是我需要的。尽管如此,它仍然为KI(在iota 中)返回错误的值。对于I,它返回一个proc 对象,对于K,它返回2... 这可能是正确的值,尽管我希望它返回1
    【解决方案2】:

    感谢 sepp2k 我想我想通了,这里是任何有兴趣的人的答案:

    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
       }
       i[]
    }
    
    p BASIS[BASIS][1]          # => 1
    p iota["*ii"][1]           # => 1
    
    p K[1][2]                  # => 1
    p iota["*i*i*ii"][1][2]    # => 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-13
      • 2021-06-11
      相关资源
      最近更新 更多