是否可以直接在指定函数上使用模式匹配,或者使用一些不需要为我需要的每个函数指定类型的漏洞利用?
只是为了解释一些事情,假设我有类似
的类型type BBoolOp = (bool->bool->bool)*term*term
并假设bool->bool->bool
函数非常简单,只有(&&)
(||)
..
是否可以根据指定的函数执行不同的操作:
match bop with
(||) -> do something
| (&&) -> do something else
这不应该是可能的,因为无法比较函数,但可能存在一种利用来做我正在尝试做的事情:)
提前致谢
答案 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