我见过有一种方法可以在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的定义。而它只适用于我所控制的类型。例如,我列出了我使用过的列表示例,但我打算将其用于其他类型,例如,可能不涉及列表中的索引。 –