【问题标题】:Matching with functions in OCaml?与 OCaml 中的函数匹配?
【发布时间】:2010-07-20 12:40:26
【问题描述】:

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

只是为了更好地解释事情假设我有这样的类型

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

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

是否可以根据指定的功能做不同的事情,例如:

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

这应该是不可能的,因为无法比较函数,但可能存在一个漏洞来做我想做的事情:)

提前致谢

【问题讨论】:

    标签: function pattern-matching ocaml


    【解决方案1】:

    正如您所提到的,比较函数不受支持。在某些情况下它可能会起作用,但取决于这不是很好的 IMO。

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我不会这样做。语言定义随时可能发生变化,我不会依赖于成为表来测试未来版本的功能。
      猜你喜欢
      • 2019-02-26
      • 2016-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-16
      • 1970-01-01
      • 2011-02-14
      相关资源
      最近更新 更多