2012-01-29 39 views
-3

那么OCaml中,你可以在编译时做到这一点:OCaml中可以进行“动态”模式匹配吗?

let handle item = match item with 
    | 1 -> "Do this"; 
    | 2 -> "Do that"; 
    | n -> "Do Nothing"; 
;; 

是否有在运行时实现它的方法吗?像某种责任链模式?

+2

你能给一个(伪)代码的例子,你想做一个运行时? – phimuemue 2012-01-29 14:35:18

+2

当人们在[两个不同的频道]上提出同样的问题时,我讨厌它(http://www.developpez.net/forums/d1179894/autres-langages/langages-fonctionnels/caml/pattern-matching-dynamique/)。通过重复解释或理解问题来确保帮助人员浪费时间的好方法。请不要再这样做。在事情的宏伟计划中,有助于人们的时间可能是一种随意浪费的免费资源,但可以想象出答案背后的人。 – gasche 2012-01-30 10:30:00

+0

我同意gasche。下次您有OCaml问题时,请在这里和其他地方提出您的问题。 – 2012-02-13 17:13:33

回答

2

是的,有这样的模式。

让我们假设你正在处理的必须接受一个整数并返回一个字符串的函数,在默认情况下它会返回"Do nothing"每一个整数:

let func : (int -> string) ref = ref (fun _ -> "Do nothing") 

let _ = (!func) 1 
- : string = "Do nothing" 

如果你想说,"Do this"应该返回的参数是1时,你可以这样做:

let() = 
    let old = !func in 
    func := (function 1 -> "Do this" | n -> old n) 

let _ = (!func) 1 
- : string = "Do this"