首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >长生不老与列表模式匹配后得到x

长生不老与列表模式匹配后得到x
EN

Stack Overflow用户
提问于 2017-01-26 09:53:06
回答 2查看 447关注 0票数 0

药剂是否以任何方式处理与常量相关的匹配值?这方面的一个例子是:

所有的例子都是这个想法的伪语法。

  • (后面的值)3= x
  • iex> [ _ | [ 3 | [ x | _ ] ] ] = [1,2,3,4,5,6,7] // x = 4
  • (6之前的值)= x
  • iex> [ _ | [ x | [ 6 | _ ] ] ] = [1,2,3,4,5,6,7] // x = 5
  • (3到6之间值的子列表)= x
  • iex> [ _ | [ 3 | [ x | [ 6 | _ ] ] ] ] = [1,2,3,4,5,6,7] // x = [4,5]
  • (4之后的3个值的子列表)= a,b,c
  • iex> [ _ | [ 3 | [ [a,b,c] | _ ] ] = [1,2,3,4,5,6,7] // x = [5,6,7]

不幸的是,大多数书籍和在线文档只涉及来自第一个索引的绝对位置,例如通过[ head | tail ]从头中提取的N个元素,但是随着目标值与第一个元素的距离越来越远,使用[ _ | [ _ | [ _ | [ x | _ ] ] ] ]这样的语法来获得列表中的第4个元素就有点愚蠢了。

是否有任何语法来匹配列表的相对索引?不正确但在概念上合理的语法的一个例子是通过[ _ | [ x | [] ] ]获取列表中的最后一个索引,或者通过[ _ | [ 3 | [ x | _ ] ] ]在索引3之后获取值。

EN

回答 2

Stack Overflow用户

发布于 2017-01-26 10:04:09

灵丹妙药/Erlang不支持在列表中未知位置的项目匹配模式,因此您提到的4种情况都不能通过模式匹配完成。

唯一可以简化的是,您需要列表的第四个元素。而不是:

代码语言:javascript
运行
复制
[_ | [_ | [_ | [x | _]]]]

您可以使用以下模式:

代码语言:javascript
运行
复制
[_, _, _, x | _]
代码语言:javascript
运行
复制
iex(1)> [_, _, _, x | _] = [1, 2, 3, 4, 5, 6]
[1, 2, 3, 4, 5, 6]
iex(2)> x
4
票数 1
EN

Stack Overflow用户

发布于 2017-01-26 12:18:54

您正在滥用模式匹配,这是众所周知的灵丹妙药。如果您对在列表中查找值感兴趣,则不存在任何模式。

-(后面的值)3=x

代码语言:javascript
运行
复制
iex> [_, x | _] = Enum.drop_while([1,2,3,4,5,6,7], fn e -> e != 3 end)
#⇒ x = 4

- (6之前的值)=x

代码语言:javascript
运行
复制
iex> [x | _] = [1,2,3,4,5,6,7]
...> |> Enum.take_while(fn e -> e != 6 end)
...> |> Enum.reverse
#⇒ x = 5

-(3至6之间数值的子列表)=x

代码语言:javascript
运行
复制
iex> [_ | x] = [1,2,3,4,5,6,7]
...> |> Enum.drop_while(fn e -> e != 3 end)
...> |> Enum.take_while(fn e -> e != 6 end)
#⇒ x = [4, 5]

-(4之后的3个值的子列表)= a,b,c

代码语言:javascript
运行
复制
iex> [1,2,3,4,5,6,7] 
...> Enum.drop_while(fn e -> e != 4 end)
...> Enum.slice(1..3)
#⇒ [5,6,7]

Enum

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

https://stackoverflow.com/questions/41870779

复制
相关文章

相似问题

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