鉴于以下内容目前在Ruby中工作,就像Haskell的构造函数模式匹配的一个非常有限的版本:
[[1,[2,3]]].map {|(x, (y, z))| x + y * z} #=> [7]我想知道它是否也支持“as-pattern”( Haskell称之为“as-pattern”)的语法,这基本上是将多个绑定放在相同的参数上,如下所示:
[[1,[2,3]]].map {|(x, yz@(y, z))| [x + y * z, yz]} #=> [7, [2,3]]我尝试了@和其他符号,但它们都导致了语法错误。
发布于 2018-06-05 06:04:22
据我所知,ruby目前(2018-06-04)还没有这个功能。
没有正式的ruby语言规范可供参考,但有The Ruby Spec Suite。有关块参数的一些奇怪和不同寻常的示例,请查看language/block_spec.rb。
块参数非常强大,并且支持可选的args、splats、post-args、析构、嵌套析构、关键字参数、块级变量。这真是令人印象深刻。
如果你能读懂C(我不能),并且你真的想深入研究这一点,你可以在parse.y:2980的解释器语法中找到块参数的定义。
发布于 2018-06-05 06:25:58
不确定as-patterns,但在ruby中,您可以使用lambda & proc实现类似的东西
对于第一个模式
2.3.1 :030 > pattern = Proc.new {|x, y, z| x + (y * z) }
=> #<Proc:0x007fa6fd5a2188@(irb):30>
2.3.1 :031 > func = lambda { |arr| arr.map {|ar| pattern.call(*ar)} }
=> #<Proc:0x007fa6fddc1328@(irb):31 (lambda)>
2.3.1 :032 > func.call([[1,2,3], [4,5,6]])
=> [7, 34] 对于第二个模式
2.3.1 :033 > pattern = Proc.new {|x, y, z| [x + (y * z), [y, z]] }
=> #<Proc:0x007fa6ffba5150@(irb):33>
2.3.1 :034 > func = lambda { |arr| arr.map {|ar| pattern.call(*ar)} }
=> #<Proc:0x007fa6fdd60aa0@(irb):34 (lambda)>
2.3.1 :035 > func.call([[1,2,3], [4,5,6]])
=> [[7, [2, 3]], [34, [5, 6]]] https://stackoverflow.com/questions/50688653
复制相似问题