首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ruby中实现iota

在ruby中实现iota
EN

Stack Overflow用户
提问于 2012-09-01 00:17:01
回答 2查看 342关注 0票数 2

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

所以!我找到了一个关于深奥编程语言的网站,发现了Iota。Iota可以说是最小的函数式语言。你可以在这里阅读更多关于它的内容:"Iota and Jot: the simplest languages?"这里是方案中Iota的参考实现:

代码语言:javascript
复制
(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]),但它返回的proc不会产生与I相同的结果。第二个测试应该返回K,但它返回一个错误。

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-01 02:15:30

多亏了sepp2k,我想我已经弄明白了,对于感兴趣的人,下面是答案:

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2012-09-01 00:37:08

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12219120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档