Соответствие с функциями в OCaml? - PullRequest
2 голосов
/ 20 июля 2010

Можно ли использовать сопоставление с образцом для указанных функций напрямую или с некоторыми эксплойтами, которые не требуют указания типа для каждой функции, которая мне нужна?1003 *

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

и предположим, что функции bool->bool->bool довольно просты, например, просто (&&) (||) ..

, возможно ли делать разные вещи в зависимости от указанной функциикак:

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

Это не должно быть возможным, потому что функции нельзя сравнивать, но, возможно, существует эксплойт для выполнения того, что я пытаюсь сделать:)

Заранее спасибо

Ответы [ 2 ]

6 голосов
/ 21 июля 2010

Сравнение функций, как вы упомянули, не поддерживается. В некоторых случаях это может сработать, но в зависимости от этого ИМО не годится.

Так что я бы просто использовал алгебраический тип данных для решения этой проблемы. Возможно, вам удастся восстановить некоторую гибкость концепции сопоставления с образцом по функциям (не требуя кода сопоставления с образцом, чтобы знать все возможные операторы), используя полиморфные варианты. Так что либо

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

или

type BBoolOp = [<`And | `Or] * term * term (* make opened/closed as needed *)
2 голосов
/ 20 июля 2010

Функции могут быть проверены на равенство. Просто убедитесь, что сравниваете функции, а не временные замыкания (и не с сопоставлением с образцом). И это сделает код трудным для чтения и хрупким.

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