2010-07-20 75 views
2

是否有可能直接使用指定函數的模式匹配,或者是否有一些不涉及爲我需要的每個函數指定類型的漏洞利用?與OCaml中的函數匹配?

只是解釋事情做得更好假設我有一個像類型

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

,並假設bool->bool->bool功能有一些像剛纔(&&)(||)很簡單..

是有可能做這取決於不同的事情在指定的功能如:

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

這應該是不可能的因爲使用功能所不能比擬的,但也許一個漏洞的存在是爲了做什麼,我試圖做:)

在此先感謝

回答

6

如您所述,比較函數是不受支持的。在某些情況下,它可能會工作,但取決於這不是好的國際海事組織。

所以我只是使用代數數據類型來解決這個問題。通過使用多態變體,您可能能夠重新獲得模式匹配功能概念的某些靈活性(不需要模式匹配代碼來了解所有可能的操作符)。因此,無論

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 
+2

我不會這麼做。語言定義可能隨時改變,我不會依賴於在未來版本中使用表來測試函數。 – 2010-07-20 23:21:17