与OCaml中的功能匹配?

时间:2010-07-20 12:40:27

标签: function pattern-matching ocaml

是否可以直接在指定函数上使用模式匹配,或者使用一些不需要为我需要的每个函数指定类型的漏洞利用?

只是为了解释一些事情,假设我有类似

的类型
type BBoolOp = (bool->bool->bool)*term*term

并假设bool->bool->bool函数非常简单,只有(&&) (||) ..

是否可以根据指定的函数执行不同的操作:

match bop with
  (||) -> do something
  | (&&) -> do something else

这不应该是可能的,因为无法比较函数,但可能存在一种利用来做我正在尝试做的事情:)

提前致谢

2 个答案:

答案 0 :(得分:6)

如您所述,比较功能是不受支持的。在某些情况下,它可能会起作用,但取决于那是不好的IMO。

所以我只想使用代数数据类型来解决这个问题。您可以通过使用多态变体重新获得模式匹配功能概念的一些灵活性(不需要模式匹配代码来了解所有可能的运算符)。所以要么

type BBoolOper = And | Or
type BBoolOp = BBoolOper * term * term

type BBoolOp = [<`And | `Or] * term * term (* make opened/closed as needed *)

答案 1 :(得分:2)

可以测试函数是否相等。确保比较函数而不是临时闭包(而不是模式匹配)。它会使代码难以阅读和脆弱。

# (+) == (+);;
- : bool = false
# let f = (+);;
val f : int -> int -> int = <fun>
# f == f;;
- : bool = true