开发者

Matching with functions in OCaml?

Is it possible to use pattern matching over specified functions directly or with some exploits that don't involve specifying a type for every function I need?

Just to explain things better suppose I have a type like

type BBoolOp = (bool->bool->bool)*term*term

and suppose that the bool->bool->bool functions are some quite simple like just (&&) (||)..

is it possible to do different things depending on the function that is specified like:

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

This shouldn't be possible because functions can't be comp开发者_运维知识库ared but maybe an exploit exists to do what I'm trying to do :)

Thanks in advance


Comparing functions is, as you mention, unsupported. In some cases it may work, but depending on that is not good IMO.

So I would just use an algebraic data type to solve this problem. You might be able to regain some of the flexibility of the pattern-matching-over-functions concept (not needing the pattern matching code to know of all possible operators) by using polymorphic variants. So either

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

or

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


Functions can be tested for equality. Just be sure to compare functions and not temporary closures (and not with pattern-matching). And it will make code hard to read and fragile.

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜