3

鉴于以下目前在 Ruby 中工作,就像 Haskell 的构造函数模式匹配的一个非常有限的版本:

[[1,[2,3]]].map {|(x, (y, z))| x + y * z} #=> [7]

我想知道它是否还支持“as-patterns”(Haskell 称之为)的语法,这基本上是将多个绑定放在相同的参数上,如下所示:

[[1,[2,3]]].map {|(x, yz@(y, z))| [x + y * z, yz]} #=> [7, [2,3]]

我尝试@了和其他符号,但它们都导致语法错误。

4

2 回答 2

2

据我所知,ruby 目前(2018-06-04)没有这个功能。

没有正式的 ruby​​ 语言规范可供参考,但有 The Ruby Spec Suite。查看language/block_spec.rb以获得一些奇怪和不寻常的块参数示例。

块参数非常强大,支持可选参数、splats、post-args、解构、嵌套解构、关键字参数、块级变量。这是相当令人印象深刻的。

如果您可以阅读 C(我看不懂)并且您真的想进一步深入研究,您可以在parse.y:2980的解释器语法中找到块参数的定义。

于 2018-06-04T22:04:22.330 回答
0

不确定但是在 ruby​​ 中你可以使用&as-patterns来实现类似的东西lambdaproc

对于第一种模式

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]]] 
于 2018-06-04T22:25:57.823 回答