为什么OCaml不允许功能匹配?

时间:2012-12-19 23:11:57

标签: functional-programming ocaml

如果我这样做

match (fun i -> i + 1) with
   (fun i -> i + 1) -> true;;

被拒绝了。

为什么OCaml不允许功能匹配?

3 个答案:

答案 0 :(得分:4)

Ocaml(如Haskell)基于Lambda Calculus。 比较两个函数通常是不可判定的:如果你可以比较两个函数,那么你可以说一个函数是否终止。但是,如果你的语言是Turing-Complete,你就不能。

我们使用的所有通用语言都是Turing-Complete:它们能够计算任何东西。

所以,在某些情况下,也许有可能在一般语言中是不可能的。

答案 1 :(得分:3)

这有很多难题。

  • 功能如何精确匹配?例如。 fun x -> x + 1应该与您的版本匹配吗? fun i -> 1 + ifun i -> ((fun x -> i+1) 42)怎么样? AFAIK没有办法证明两个任意函数在行为上是等价的(在纯lambda-calculus函数的情况下可能存在)。

  • 编译函数,并且它们的语法结构在运行时不再存在。但是,通过身份匹配函数当然是可能的。

  • 模式匹配是关于解构值的,但是在OCaml中没有符号来区分函数中使用的变量和作为模式一部分的变量。

在我的主人期间,我们研究了Lambda Prolog,它能够统一lambda表达式;这看起来很漂亮(虽然我的记忆有点远)但语言是一个研究原型甚至不如普通Prolog那么受欢迎......我很乐意得到有关它的新闻:)

答案 2 :(得分:2)

难以比较相等的函数。如果您根据函数的文本表示定义相等性,则fun x -> x + 1将与fun x -> 1 + x进行比较。这不是那么有用。如果根据函数的值定义相等性,则结果不可计算。结果是没有合理的定义。