2012-04-19 57 views
2

函子我想寫:替代在F#

module A = 
    type Token 
    let foo Token = 

module B = 
    type Token 
    let foo Token = 

let run (m : module) = 
    m.B 
    |> m.foo 

基本功能是這樣的模塊中通用。有沒有辦法在F#中做到這一點?

+0

所以我會理解這個權利:

let tok = { new Token with member x.Foo() = 42 } 

對應於您run功能只是一個Foo成員的調用的代碼?你基本上想要在模塊上重載一個重載的函數? – 2012-04-19 13:26:07

+0

是的,你可以在ML中使用函數來做到這一點,但是我想知道是否有其他方法可以烘焙到F#中,因爲他們決定不支持函子 – jz87 2012-04-19 14:05:43

+1

我認爲實現接口的類型是最接近的。 – Daniel 2012-04-19 14:12:53

回答

3

正如kvb在評論中指出的那樣,如果沒有現實的例子,很難給出答案,因爲最好的方法將取決於你實際要做的事情。

在這個微不足道的例子中,我可能會使用F#界面來表示Token並將Foo添加爲成員。假設Foo返回int,可以編寫的定義是這樣的:

type Token = 
    abstract Foo : unit -> int 

然後就可以實現不同的令牌或者使用類(這是相當重量級)或使用對象表達式。例如:tok.Foo()