我目前正在做一些关于F#地图和C#字典的测试。我意识到它们在实现方面有很大的不同,但它们确实为各自的语言提供了相同的用途。
我设计了一个简单的测试来检查插入时间,因为F#映射是不可变的,因此它必须为每次插入创建一个全新的映射。我想知道这到底有多成功。
测试如下:
//F#
module Test =
let testMapInsert () =
let sw = Stopwatch()
let rec fillMap endIdx curr map =
if curr = endIdx then
我们有一个F#程序集(AssemblyOne),它引用单个Visual 2012解决方案中的另一个F#程序集(AssemblyTwo)。AssemblyTwo具有对C# DLL (MyCSharpLib)的引用。
在AssemblyOne中定义的函数调用在AssemblyTwo中定义的函数
namespace AssemblyOne
[<RequireQualifiedAccess>]
module MyModuleA =
let FetchResult id =
let result = AssemblyTwo.MyModuleC.FetchResult
它是C#和F#之间的互操作
在F#中,
type test =
{
value: int
}
type Wrapper (value: test) =
member val Value = value with get, set
let trythis = new Wrapper(null) // error as expected
但是,在C#中
var trythis = new Wrapper(null); //this runs fine
这个问题非常技术性,它深深地介于F# / C#的差异之间。我很可能漏掉了什么东西。如果你发现一个概念错误,请评论,我会更新这个问题。
让我们从C#世界开始。假设我有一个简单的业务对象,称为Person (但是,请记住,100+对象比我们使用的业务域中的对象要复杂得多):
public class Person : IPerson
{
public int PersonId { get; set; }
public string Name { get; set; }
public string LastName { get; set; }
}
我使用DI / IOC,这样
我有两个用C#编写的库,我想在F#应用程序中使用它们。两个库都使用相同的类型,但是,我无法说服F#的类型检查器。
下面是一个使用Office互操作类型的简单示例。F#似乎对这些类型的问题特别敏感。在F#方面抛出似乎对情况没有任何帮助。所有三个项目都引用同一个程序集("Microsoft.Office.Interop.Excel“版本14.0.0.0)。
在项目"Project1“( C#项目)中:
namespace Project1
{
public class Class1
{
public static Microsoft.Office.I
在C#中,如果委托定义如下:
delegate void A();
A a = () => {Console.WriteLine("Test")};
它可以通过以下方式调用:
a.Invoke(); // Works
a(); // Also works
在F#中,可以调用C#委托:
a.Invoke() // Works fine.
a() // Error: This value is not a function and cannot be applied
为什么我不能在F#中使用第二种方法?在C#中,()操作符是简单地映射到Invoke
我有一个F#函数,它将一个字符串和一个数组返回给一些C#代码。我尝试了几种方法,并做了一些搜索,但没有结果。这是怎么做的?我的F#函数(Gen.Best)以:
(T1 Best).ToString,T2 Best // return a (string) and a (float []) to C#
F#显示返回类型为(单元->字符串)* float 是(float -> float)函数。
在我的C#代码中有:
Tuple<string, double[]> Ans = Gen.Best(XData, ResultData);
编译器抱怨:
类型'Micro
我正在用F#练习,我已经想过要为F#实现一个类型受限的比较函数。在C#中,它是这样实现的
// in C#
static int cmp<T>(T x, T y) where T: System.IComparable<T>
{
return x.CompareTo(y);
}
然而,在F#中,我想出的最好的方法是这样的。
(* in F# *)
let cmp (x: 'a when 'a :> 'a System.IComparable) (y: 'a when 'a :> 'a System.IC
我有一个包含两个函数的F#类库程序集:
let add a b = a + b
和
let rec aggregateList list init (op:int -> int -> int) =
match list with
|[] -> init
|head::tail ->
let rest = aggregateList tail init op
op rest head
我有一个引用F#库的C#控制台应用程序,并尝试执行以下操作:
FSharpList<int> l = new FSharp
使用F#与C#区分工会的最佳方法是什么?
我研究这个问题已经有一段时间了,我可能已经找到了最简单的方法,但是由于它是相当复杂的,可能还有一些我看不见的东西。
有受歧视的工会,例如:
type Shape =
| Rectangle of float * float
| Circle of float
我从C#中发现的用法将是(避免使用vars,以使类型变得明显):
Shape circle = Shape.NewCircle(5.0);
if (circle.IsCircle)
{
Shape.Circle c = (Shape.Circle)circle;
d
(我知道现有的非常相似,但不完全相同,而且还没有解决方案)
在我的mac (Catalina10.15.7)上,我通过这个.NET没有问题地安装了这个内核。
命令
dotnet --help
正确返回帮助。
当尝试初始化一个新项目时,它会失败,因为:
$ dotnet new –lang f#
Getting ready...
Couldn't find an installed template that matches the input, searching online for one that does...
No templates found matching: '
给定一个F#类型:
type Foo() =
member this.Prop with get() = ()
interface IDisposable with
member this.Dispose() = ()
在C#中,我创建了对象,但不能调用Dispose()
var x = new Foo();
x.Dispose(); // compile error, x does not contain a definition of Dispose
但是,我可以这样写:
((IDisposable)x).Dispose(); // works, but
我使用的一个库在C#中定义了这一点:
public ushort GetParameterSet(string name, out ParameterSet parameterSet)
我正在尝试从F#调用它:
let parameterSet = new ParameterSet();
let retVal = currentPanel.GetParameterSet(name, ref parameterSet);
但是,即使parameterSet被设置为在C#方法中具有有效数据的该类的实例,它在F#中也不会更改。
这里我漏掉了什么?