"Do" Elixir 中的符号和 Haskell

"Do" notation in Elixir and Haskell

我一直在 elixir 中使用 "do/end" 符号,或多或少像命令式块定界符。 (换句话说,do 类似于 C 类语言中的 {end 类似于 })。

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

是也不是。 do/end 是关键字列表的语法便利。

你以前可能写过if表达式。有人可能希望看到的是

if predicate do
  true_branch
else
  false_branch
end

这也可以使用关键字列表来编写。以下完全相同。

if predicate, do: true_branch, else: false_branch

使用 do/end 符号可以让我们在编写代码块时消除冗长。下面两个if表达式等价

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

if predicate, do: (
  a = foo()
  bar(a)
)

定义函数也是如此。 def/2 宏也使用关键字列表。这意味着您可以定义如下函数

def foo, do: 5

您可以在 getting started 指南中阅读更多相关信息。