是f#记录与.net结构相同吗?我看到人们谈论f#struct,他们是否使用这个术语与F#记录可互换?就像在FSharp runs my algorithm slower than Python中一样,讨论使用struct作为字典键但是使用代码type Tup = {x: int; y: int}
为什么这比上面链接中的字典键更快?
答案 0 :(得分:16)
不,实际上,F#中的记录类型是一种引用类型,只是具有特殊的函数编程功能,如属性上的模式匹配,更容易的不变性和更好的类型推断。
我认为Laurent的加速一定是出于其他原因,因为我们可以证明Tup
不是ValueType:
type Tup = {x: int; y: int}
typeof<Tup>.BaseType = typeof<System.Object> //true
尽管
type StructType = struct end
typeof<StructType>.BaseType = typeof<System.ValueType> //true
typeof<StructType>.BaseType = typeof<System.Object> //false
答案 1 :(得分:4)
斯蒂芬说,这是一种参考类型。以下是type Tup = {x: int; y: int}
的编译代码(发布模式):
[Serializable, CompilationMapping(SourceConstructFlags.RecordType)]
public sealed class Tup : IEquatable<xxx.Tup>, IStructuralEquatable, IComparable<xxx.Tup>, IComparable, IStructuralComparable
{
// Fields
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
internal int x@;
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
internal int y@;
// Methods
public Tup(int x, int y);
...
// Properties
[CompilationMapping(SourceConstructFlags.Field, 0)]
public int x { get; }
[CompilationMapping(SourceConstructFlags.Field, 1)]
public int y { get; }
}
答案 2 :(得分:3)
答案 3 :(得分:1)