我見過有一種方法可以在Scala類型中使用,名爲apply。這將使得能夠調用該類型的實例,就好像它是功能或類似的。像例如Scala列表一樣,可以爲列表中的第一個元素寫myList(0)。F#斯卡拉申請方法
在F#中有這樣的東西嗎?
我見過有一種方法可以在Scala類型中使用,名爲apply。這將使得能夠調用該類型的實例,就好像它是功能或類似的。像例如Scala列表一樣,可以爲列表中的第一個元素寫myList(0)。F#斯卡拉申請方法
在F#中有這樣的東西嗎?
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#也能正常工作。
不錯。我想我應該檢查MSIL,看看它是什麼輸出比較差異。 –
我做到了,無法找到任何東西,但我可能會錯過一些東西。 F#編譯器很可能會整體查找程序集的屬性,以決定是否將其視爲F#或「other」。 –
我不太清楚你要的是什麼。您可以在F#中編寫'myList。[0]'以獲得相同的效果 - 您是否希望語法看起來完全像函數應用程序? –
你也想要這個內置類型或只是你控制定義? –
我想看起來完全像Scala的定義。而它只適用於我所控制的類型。例如,我列出了我使用過的列表示例,但我打算將其用於其他類型,例如,可能不涉及列表中的索引。 –