2014-06-29 111 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”。 –