当我们使用Active Patterns对值进行模式匹配时,将隐式调用一个“转换”函数。所以不用写:
match value with
| Tag1 -> ...
| Tag2 -> ...
Run Code Online (Sandbox Code Playgroud)
我可以明确地写:
match convert value with
| Tag1 -> ...
| Tag2 -> ...
Run Code Online (Sandbox Code Playgroud)
这样,我不必在这里使用活动模式。当然,我必须显式调用该convert函数,并且必须显式声明一个联合类型。但这对我来说是次要的事情。
那么活动模式的重点是什么?
我几天前开始使用F#,但我不明白为什么重新定义了一些很长时间以来很普遍的事情?
/* my comment */,在几种语言中很常见,几十年来一直如此。真的有理由去(* my comment *)吗?type variablename(例如,int i这也是很常见的),难于解析该类型之前和之后的类型吗?!=不平等现象;是<>为了避免与其他事物发生冲突或只是“变得与众不同” 而进行了更改?<-与可变项一起使用,但=不可变..其背后的原因是什么?我敢肯定还有其他几个。
我不是在寻找有关更改是否良好的“意见”,但我很想知道它们背后是否存在某些特定的推理,例如简化解析等,因为我想知道这些变化的好处大于不遵循普遍采用的公约的危害。
我想用这样的原型编写一个C#方法:
void memcpy(byte[] dst, int dstOffset, byte[] src, int srcOffset, int len);
Run Code Online (Sandbox Code Playgroud)
这个方法有2个选项:
1.
void memcpy(byte[] dst, int dstOffset, byte[] src, int srcOffset, int len)
{
for (int i = 0; i < len; i++)
{
dst[dstOffset + i] = src[srcOffset + i];
}
}
Run Code Online (Sandbox Code Playgroud)
2.
void memcpy(byte[] dst, int dstOffset, byte[] src, int srcOffset, int len)
{
IntPtr intPtr = getIntPtr(dst, dstOffset);
System.Runtime.InteropServices.Marshal.Copy(src, srcOffset, intPtr, len);
}
IntPtr getIntPtr(byte[] buffer, int offset)
{
IntPtr intPtr;
unsafe
{
fixed (byte* …Run Code Online (Sandbox Code Playgroud)