Elixir和Haskell的"做"符号

Mar*_*van 4 elixir do-notation

我一直在elixir中使用"do/end"表示法或多或少像命令式块分隔符.(换句话说,do就像是像{C语言end一样}).

这是对正在发生的事情的准确描述吗?或者它更像是Haskell do符号,它为monad构造语法糖,允许类似命令式编码?

Jus*_*ood 7

是的,不是.do/ end是关键字列表的语法便利.

您可能以前写过if表达式.人们可能期望看到的是类似的东西

if predicate do
  true_branch
else
  false_branch
end
Run Code Online (Sandbox Code Playgroud)

这也可以使用关键字列表编写.以下是完全相同的.

if predicate, do: true_branch, else: false_branch
Run Code Online (Sandbox Code Playgroud)

使用do/ endnotation允许我们在编写代码块时删除详细程度.以下两个if表达式是equivelent

if predicate do
  a = foo()
  bar(a)
end

if predicate, do: (
  a = foo()
  bar(a)
)
Run Code Online (Sandbox Code Playgroud)

这与定义函数相同.该def/2宏使用的关键词名单.这意味着您可以定义如下函数

def foo, do: 5
Run Code Online (Sandbox Code Playgroud)

您可以在入门指南中阅读有关此内容的更多信息.