为什么 x = x +1 在 Elixir 中有效?

2024-05-01

我读到的有关 Elixir 的所有内容都表明,赋值应该被视为模式匹配。如果是这样,为什么 x = x + 1 在 Elixir 中有效?不存在 x = x + 1 的 x 值。


我读到的有关 Elixir 的所有内容都表明,赋值应该被视为模式匹配。

在长生不老药中,= is称为模式匹配运算符,但它的工作方式与 Erlang 中的模式匹配运算符不同。这是因为在 Elixir 中变量并不像在 Erlang 中那样是单一赋值。这是 Erlang 的工作方式:

~/erlang_programs$ erl
Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V9.3  (abort with ^G)

1> X = 15.
15

2> X = 100.
** exception error: no match of right hand side value 100

3> X.
15

4> 

因此,在 Erlang 中这会失败:

4> X = X + 1.
** exception error: no match of right hand side value 16

对于 Erlang 的单一赋值,事情非常简单:因为 X 已经有一个值,所以该行X = X + 1不能尝试为 X 分配新值,因此该行是尝试模式匹配 (15 = 15 + 1),这总是会失败。

另一方面,在 Elixir 中变量不是单一赋值:

Interactive Elixir (1.6.6) - press Ctrl+C to exit (type h() ENTER for help)

iex(1)> x = 15
15

iex(2)> x = 100
100

iex(3)> x
100

iex(4)> 

事实上,Elixir 中的变量不是单一赋值,这意味着 Elixir 需要在您编写时做出选择:

x = 10
x = x + 1  #or even x = 15

选择 1) 第二行是否应该被解释为赋值给x?
选择 2)第二行是否应该被解释为尝试模式匹配(即10 = 11)?

Elixir 采用选择 1。这意味着在 Elixir 中实际使用所谓的模式匹配运算符执行模式匹配更加困难:您必须使用 pin 运算符(^) 与匹配运算符(=):

x = 10
^x = x + 1  

现在,第二行总是会失败。如果您想在不使用 pin 运算符的情况下执行模式匹配,还有一个技巧在某些情况下会起作用:

x = 10
12 = x

在第二行中,将变量放在右侧。我认为规则可以这样表述:在模式匹配运算符的右侧(=),变量总是被评估,即用它们的值替换。左侧的变量总是分配给——除非使用 pin 运算符,在这种情况下,固定变量将被其当前值替换,然后与右侧进行模式匹配。因此,调用 Elixir 可能更准确=混合赋值/模式匹配运算符。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 x = x +1 在 Elixir 中有效? 的相关文章

  • 与可变结构相比,不可变结构有哪些优点?

    我已经知道不变性相对于可变性的好处在于能够推理代码并引入更少的错误 尤其是在多线程代码中 不过 在创建结构时 我看不出创建一个完全不可变的结构比创建一个可变的结构有任何好处 让我们以保存一些分数的结构为例 struct ScoreKeepe
  • 寻找一种重构 D3.js 风格的方法链接模式的方法

    在学习 D3 js 时 我遇到了博客文章 http bost ocks org mike chart 解释其可重用代码单元背后的主要设计模式 我复制了下面的相关代码 下面呈现的模式的方式正是在 D3 代码库和插件中使用的方式 example
  • 为什么要使用 Python 进行函数式编程?

    在工作中 我们过去常常以非常标准的面向对象方式来编写 Python 程序 最近 有几个人加入了功能性潮流 他们的代码现在包含更多的 lambda map 和reduce 我知道函数式语言有利于并发性 但是函数式 Python 编程真的有助于
  • “foop”:命名约定?它是“foo”的辅助递归函数;后缀“p”是什么意思?

    我遇到了以下代码片段 函数定义 choose x xs choosep x xs where choosep x x choosep x x choosep x xs choosep x xs in 柯里编程语言 http en wikip
  • f# 运行总计序列

    好吧 这看起来应该很容易 但我就是不明白 如果我有一个数字序列 如何生成由运行总计组成的新序列 例如 对于序列 1 2 3 4 我想将其映射到 1 3 6 10 以适当的功能方式 Use List scan https msdn micro
  • 如何在 Perl 中以函数式风格进行编码?

    你如何 have a sub返回一个sub or 将文本作为代码执行 in Perl 另外 如何拥有匿名函数存储状态 子返回子作为coderef example 1 return a sub that is defined inline s
  • 如何通过 SSL 从 Phoenix Web App 连接到 PostgreSQL?

    When trying to run Elixir Phoenix Web Application using PostgreSQL Database hosted 3rd party Database as a Service Azure
  • “函数是第一等值”这到底是什么意思?

    有人可以用一些很好的例子清楚地解释它吗 在解释函数式编程时 我在 Scala 中遇到了这句话 一流 并不是一个正式定义的概念 但它通常意味着一个实体具有三个属性 有可能used 不受限制 只要 普通 值可以 即从函数传递和返回 放入容器等
  • 减少/折叠幺半群列表,但减少器返回任一

    我发现自己遇到过几次这样的情况 我有一个减速器 组合 fn 如下所示 def combiner a String b String Either String String a b asRight String 它是一个虚拟实现 但 fn
  • 单位安全平方根

    我只是想知道如何以与 F 正确交互的方式编写用户定义的平方根函数 sqrt 单位制 http blogs msdn com andrewkennedy archive 2008 09 04 units of measure in f par
  • Haskell 中列表列表的笛卡尔积

    给定一个长度列表的列表x所有子列表的长度都相同y 输出y x长度列表x包含每个子列表中的一项 例子 x 3 y 2 1 2 3 4 5 6 Output 2 3 8不同的输出 1 3 5 1 4 5 1 3 6 1 4 6 2 3 5 2
  • 为什么 Javascript 函数在实例化时的行为与执行时的行为不同?

    我来自 C PHP 并试图了解 Javascript 的想法 即函数是变量 对象并且具有准构造函数等 任何人都可以解释为什么以下代码会起作用 即 为什么实例化变量 函数时不显示 2 test 为什么执行变量 函数时不显示 1 test co
  • 在 Haskell 中合并两个列表

    无法弄清楚如何合并两个列表通过以下方式在哈斯克尔 INPUT 1 2 3 4 5 11 12 13 14 OUTPUT 1 11 2 12 3 13 4 14 5 我想提出一个更懒的合并版本 merge ys ys merge x xs y
  • 使用fold_left/right反转OCaml中的列表

    更新 解决方案 感谢 jacobm 的帮助 我想出了一个解决方案 Folding Recursion let reverse list 3 theList List fold left fun element recursive call
  • Elixir Ecto:模式中的多个belongs_to关系

    我有以下架构 defmodule Message do use Ecto Schema schema messages do belongs to user FPL Club foreign key user to id belongs t
  • 函数式 Scala 中的选择排序

    我正在学习 Scala 编程 并编写了选择排序算法的快速实现 然而 由于我对函数式编程还不太了解 所以在转换为更 Scala 风格时遇到了困难 对于 Scala 程序员来说 如何使用 Lists 和 vals 来做到这一点 而不是回到我的命
  • 构造微积分中的“Refl”东西?

    在语言中 例如Agda Idris or Haskell对于类型扩展 有一个 键入类似于以下内容的内容 data a b where Refl a a a b意思是a and b是相同的 这样的类型可以定义在结构演算 https en wi
  • 函数式语言中的部分求值和函数内联有什么区别?

    我知道 函数内联就是用函数定义代替函数调用 部分评估是在编译时评估程序的已知 静态 部分 在 C 等命令式语言中 两者之间存在区别 其中运算符与函数不同 但是 在像 Haskell 这样的函数式语言 其中运算符也是函数 中 两者之间有什么区
  • 如何在 Octave 中使用具有自定义功能的地图?

    假设我有一个集合A A 0 6 100 我有一个功能fib n function retval fib n g1 1 5 5 2 g2 1 5 5 2 retval 1 5 5 g1 n g2 n endfunction 我希望能够申请fi
  • 如何在简单的 Elixir 脚本中加载 Elixir 库?

    在 ruby 脚本中 我可以简单地执行以下操作 require some gem SomeGem do something 我怎样才能在 Elixir 中做类似的事情exs脚本而不创建一个全新的混合项目 到目前为止 我已经在谷歌上搜索了执行

随机推荐

  • 检查手机是否可以发送短信

    我已经读过一些相关的问题 但大多数都是针对呼叫 而不是短信 到目前为止我发现的是 TelephonyManager manager TelephonyManager context getSystemService Context TELE
  • 如何从 jenkins 作业的 scm 轮询中排除 jenkins 文件

    我正在使用声明性管道语法 我的 jenkins 文件存储在 git hub 存储库中 与要构建的代码分开 因此我设置了 jenkins 作业以从 scm 获取管道脚本 并在 master 分支上选择我的 git 存储库 在我的管道脚本中 我
  • unix下C++递归复制目录

    没有任何可供使用的功能示例c without additional libs将递归文件和文件夹复制到新位置 一些替代方案system cp R f dir call 我只找到这个C 中的递归目录复制 https stackoverflow
  • 网络抓取未知数据结构(JSON、嵌套列表或其他什么?)

    我构建了一个网络抓取工具this https campus datacamp com courses intro to python for data science chapter 1 python basics该页面取决于将字符串解析为
  • 在 Firebase 管理中验证无密码电子邮件注册

    我试图让我的应用程序的用户通过电子邮件 链接登录 无需密码 客户端 用 React Native 编写 使用 Javascript SDK 请求登录链接 如下所示 基于这个答案 https stackoverflow com questio
  • 使用 kdeplot 对数刻度

    我正在尝试使用 Seaborn 的 kdeplot 制作一个漂亮的自由能表面 热图 我非常接近 但无法找到改变颜色条比例的方法 颜色条比例很重要 因为它应该表示地图上不同坐标处的能量差异 我需要知道如何缩放颜色条的值 0 5961573 l
  • +[NSColor selectedMenuItemColor] 如何神奇地绘制渐变?

    我正在实现一个自定义 NSMenuItem 视图显示出一个亮点 https stackoverflow com questions 6054331 highlighting a nsmenuitem with a custom view当用
  • 如何在 postgresql 的“tablefunc”查询中包含空值?

    我正在尝试使用crosstab http www postgresql org docs 9 1 static tablefunc html函数于postgresql创建一个pivot table 但是 我很难理解如何在查询中构建 SQL
  • 如何隐藏 WebBrowser 直到网站完成加载/下载过程?

    我想知道我该如何隐藏WebBrowser直到网站加载过程完成 另外 我使用 Panel1 和WebBrowser在它的上面 为什么 好吧 这样 我可以完全像我想要的 WebBrowser 一样设置 Panel1 的大小和位置 然后将 Web
  • R 图在从 r 变量读取文本时使用 html 进行格式化

    我正在使用 R 包绘图器创建流程图 为了获得所需的格式 粗体 项目符号 左对齐 我可以在 html 中编写节点标签 但是 我还想通过调用 R 中的变量来填充一些文本 但我不知道如何同时执行这两项操作 html 格式化 调用 R 变量 在此代
  • 如何在RTK查询中配置存储多个中间件

    redux toolkit 给出了原始文档 import configureStore from reduxjs toolkit Or from reduxjs toolkit query react import setupListene
  • 谷歌地图转弯 GPS 导航用于 ios 开发

    我的应用程序需要包含逐段 GPS 导航 任何人都可以告诉如何集成谷歌地图进行逐段 GPS 导航 我可以在android开发中找到它 但我无法从谷歌地图的iOS开发文档中找到导航 https developers google com map
  • 键盘挂钩获取组合键(WPF)

    我尝试在这里使用这篇文章 在 WPF C 中使用全局键盘钩子 WH KEYBOARD LL https stackoverflow com questions 1639331 using global keyboard hook wh ke
  • Firemonkey 移动应用程序和远程 MySQL

    我正在使用 Delphi XE5 并且我已经创建了基本的 Firemonkey 移动应用程序 Delphi 我想连接到远程 MySQL 数据库 我应该使用哪一个数据库管道 FireDAC DBExpress 等 您可以使用标准 TSQLQu
  • UICollectionView 就像 iOS 主屏幕 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想制作一个像 iOS 主屏幕一样的 UICollectionView 我发现了几个 而且很好的 样本 例如 http mobile tu
  • 尝试使用 SwiftMailer 和 Sendgrid 发送电子邮件时出现致命错误

    我在尝试使用 swiftmailer 和 sendgrid smtp 发送电子邮件时收到此错误 致命错误 未捕获异常 Swift TransportException 消息 预期响应代码 250 但收到代码 消息 这是我的代码 hdr ne
  • 如何找到向量中第一个小于整数 X 的元素? (c++)

    如果我有以下向量 10 10 10 20 20 20 30 30 我想要一个函数返回 X 的整数的位置或直接返回 X 之后的较小元素 例如如果我正在搜索 11 我希望函数返回 2 因为第二个元素 10 是第一个较小的元素向量中大于 11 的
  • 从 WasapiLoopbackCapture 捕获音频,并转换为 muLaw

    我正在使用 WasapiLoopbackCapture 捕获音频 format IeeeFloat SampleRate 48000 BitsPerSample 32 我需要将其转换为 muLaw 8Khz 8 位 单声道 最终它将通过 S
  • 世博会错误 - 无法加载所有资源

    由于某种原因 当第一次使用命令启动我的应用程序时expo r ci no dev我收到Failed to load all assets error 收到错误的图像 https i stack imgur com pcvv4 png 如果我
  • 为什么 x = x +1 在 Elixir 中有效?

    我读到的有关 Elixir 的所有内容都表明 赋值应该被视为模式匹配 如果是这样 为什么 x x 1 在 Elixir 中有效 不存在 x x 1 的 x 值 我读到的有关 Elixir 的所有内容都表明 赋值应该被视为模式匹配 在长生不老