2014-06-29 122 views
1

我見過有一種方法可以在Scala類型中使用,名爲apply。這將使得能夠調用該類型的實例,就好像它是功能或類似的。像例如Scala列表一樣,可以爲列表中的第一個元素寫myList(0)。F#斯卡拉申請方法

在F#中有這樣的東西嗎?

+0

我不太清楚你要的是什麼。您可以在F#中編寫'myList。[0]'以獲得相同的效果 - 您是否希望語法看起來完全像函數應用程序? –

+0

你也想要這個內置類型或只是你控制定義? –

+0

我想看起來完全像Scala的定義。而它只適用於我所控制的類型。例如,我列出了我使用過的列表示例,但我打算將其用於其他類型,例如,可能不涉及列表中的索引。 –

回答

4

F#函數應用程序基於內部的FSharpFunc類型。例如,(int -> int)表示爲FSharpFunc<int, int>

但是,F#編譯器似乎知道真正的F#函數和手動嘗試實現它之間的區別,至少當實現語言是F#時。定義Foo

> let x = Foo() :> int -> int 
val x : (int -> int) 

> x 3;; 
val it : int = 4 

我不能工作,同樣的伎倆:

不過,我能僞造一個F#功能通過在C#中定義它:

public class Foo : FSharpFunc<int, int> 
{ 
    public override int Invoke(int n) 
    { 
     return n + 1; 
    } 

} 

,然後從F#在F#中,即使我在一個單獨的編譯單元中定義它。

F#編譯器似乎在其自己的對象中插入了一個屬性CompilationMapping(SourceConstructFlags.ObjectType),我找不到方法關閉它,但是即使我手動添加了該屬性,我的C#也能正常工作。

+0

不錯。我想我應該檢查MSIL,看看它是什麼輸出比較差異。 –

+0

我做到了,無法找到任何東西,但我可能會錯過一些東西。 F#編譯器很可能會整體查找程序集的屬性,以決定是否將其視爲F#或「other」。 –