模式匹配(Elixir、Haskell等)是谓词调度的一种有限形式吗



我非常喜欢函数式编程,我确实知道模式匹配和多重调度,这就是我发现谓词调度的原因,我一直想知道它是否与模式匹配有关。

我读过这个SO线程:什么是谓词调度,但仍然没有得到关于模式匹配和谓词调度之间关系的答案。我相信模式匹配和谓词调度确实是相似的,如果不是等价的话,但我想听听一些意见。

考虑一下这个Elixir代码:

def function(%{a_flag: True}=struct) do
# do smth
end
def function(struct) when is_nil(struct.field) do
# do smth else
end
def function(struct) do
# default case
end

它看起来确实是在运行时根据输入参数的属性选择函数的,这正是谓词调度的含义。when部分看起来与本文中提出的谓词调度类似:http://web.cs.ucla.edu/~todd/research/oopsla04.pdf

请分享你对此事的了解/看法。

我没听说过"谓词调度";,但我可以与您分享一些关于Elixir如何处理函数子句中的模式匹配的见解。

Elixir函数中的模式匹配与web应用程序中的路由有点类似:函数按列出的顺序进行尝试,直到可以进行匹配,然后执行该函数。这意味着最特定的匹配应该列在的第一个,而最不特定的(或catch-all(应该列在的最后一个。事实上,如果您使用适当的linter/语言服务器,如果您以无法访问的方式构建函数,则会看到警告。

例如,这些定义是有问题的:

def something(_) do
# This would always match 
end
def something(%{foo: nil}) do
# so this can never match; the previous function def is too broad
end

我们可以将您的示例改写为仅使用模式匹配(而不是使用模式匹配和保护(:

def function(%{x: true} = struct) do
# do something when x == true
end
def function(%{y: nil}) do
# do something else when x != true AND y == nil
end
def function(struct) do
# default case
end

编译器将所有这些转换为一系列条件语句,但函数子句提供了一种很好的表达语法。

根据我有限的理解,谓词调度似乎发生在函数调用级别,而模式匹配只是if/else和对象析构函数的语法糖。

因此,即使它们看起来是相关的,谓词调度也不同于模式匹配。

相关内容

最新更新