Tag: f#

在C#项目中包含FSharp.Core:解决类型冲突

我正在使用C#中的一些F#类型( Matrix等),所以我需要在我的C#项目中引用FSharp.Core程序集。 到现在为止还挺好。 但是,显然在mscorlib.dll(v4)中定义了一些在FSharp.Core(v2)中“重复”的类型,如System.Tuple和System.IObservable 。 我无法理解为什么这是在.Net 4.Matt Ellis明确表示他们将在他的MSDN文章中删除 : 遇到[重复]问题的一种语言是F#,它以前在FSharp.Core.dll中定义了自己的元组类型,但现在将使用Microsoft .NET Framework 4中添加的元组。 如果我能指定我想在C#程序中使用哪一个,我已经准备好了解这个特别不合时宜的重复。 例如,当我尝试使用System.Tuple类型时,我得到以下C#编译器错误: 错误2’c:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v4.0 \ Profile \ Client \ mscorlib.dll’和’c:\ Program Files中存在类型’System.Tuple’ (x86)\ Reference Assemblies \ Microsoft \ FSharp \ 2.0 \ Runtime \ v2.0 \ FSharp.Core.dll’ 显然,解决这个问题的方法是在C#编译器命令行上切换该类型的别名 : csc.exe MyType.cs /reference:System.Tuple`2=mscorlib.dll /reference:FSharp.Core.dll […]

如何在F#中编写一个带有可变数量参数的函数

我在C#中有一个函数,我想将它(在其他一些东西中)移植到F#,只是为了做到这一点。 不幸的是,我刚刚打了一个案例似乎没有办法在F#中表达这个:拿这个C#函数 public static T Min(params T[] p) where T : IComparable { T m1 = p[0]; foreach (T v in p) { m1 = (m1.CompareTo(v) < 0) ? m1 : v; } return m1; } 我认为这很容易,但我不明白如何在F#中指定变量参数列表。 我试过这个: let rec Min l = match l with | [] -> 0 // should throw exception here […]

F#中的C#对象初始化语法

请注意:这个问题与这个问题不一样。 我最近遇到了一些我之前没有遇到过的C#语法: 有没有办法在F#中做到这一点? class Two { public string Test { get; set; } } class One { public One() { TwoProperty = new Two(); } public Two TwoProperty { get; private set; } } var test = new One(){ TwoProperty = { Test = “Test String” }}; (注意当setter是私有时初始化器中的TwoProperty的初始化 – 它在存储在TwoProperty的对象上设置属性,但TwoProperty属性中存储新的Two实例) 编辑:我最近在monotouch的构造函数中遇到了一些C#代码,如下所示: nameLabel = new UILabel […]

C#中的FSharpChoice

我试图在C#项目中使用FSharpChoice类型。 我创造了一个这样的选择 var a = FSharpChoice.NewChoice1Of3(instofT1); 现在我如何从选择类型中获取instofT1 。 我看到我可以做一个IsChoice1Of3但是如何获得选择对象中的值?

Alea GPU教程没有使用FSharp.Core 4.4.0.0在VS 2015 Update 2上进行编译

在编译Alea GPU教程时遇到错误:在Visual Studio 2015社区更新2中使用FSharp.Core版本4.4.0.0在.Net 4.5运行时编译https://github.com/quantalea/AleaGPUTutorial 。 Fody:发生了未处理的exception:exception: 无法加载文件或程序集’FSharp.Core,Version = 4.3.1.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a’或其依赖项之一。 该系统找不到指定的文件。 堆栈跟踪: at Alea.CUDA.AOTCompileLogger..ctor(List`1 logs, Int32 warningCount, Int32 errorCount) at Alea.CUDA.AOTCompileLogger..ctor() at Alea.CUDA.AOTCompiler..ctor() at Alea.CUDA.Fody.ModuleWeaver.Execute() at lambda_method(Closure , Object ) at InnerWeaver.ExecuteWeavers() in c:\Code\Fody\FodyIsolated\InnerWeaver.cs:line 164 at InnerWeaver.Execute() in c:\Code\Fody\FodyIsolated\InnerWeaver.cs:line 82 Source: Alea.CUDA TargetSite: Void .ctor(System.Collections.Generic.List`1[Alea.CUDA.AOTCompileLogEntry], Int32, Int32) 它发生在Tutorial.Cs和Tutorial.Fs项目中,无论我如何在所有可能的.config文件中设置bindingRedirect选项。 看起来这些重定向被Fody引用加载机制忽略了。 但是,即使将教程解决方案设置为FSharp.Core 4.3.1.0也不允许我编译它。 […]

将F#引用转换为LINQ表达式

我可以通过以下代码段将Expr ‘b>类型的引号转换为Linq表达式: /// Converts a F# Expression to a LINQ Lambda let toLambda (exp:Expr) = let linq = exp.ToLinqExpression() :?> MethodCallExpression linq.Arguments.[0] :?> LambdaExpression /// Converts a Lambda quotation into a Linq Lamba Expression with 1 parameter let ToLinq (exp : Expr ‘b>) = let lambda = toLambda exp Expression.Lambda<Func>(lambda.Body, lambda.Parameters) 现在我想将Expr ‘c>或甚至Expr ‘b -> […]

无论如何使用F#的C#隐式运算符?

如果我有一个C#类隐式转换为double,就像这样: public class Parameter { private double _value; public Parameter(double value) { _value = value } public static implicit operator double(Parameter p) { return _value; } } F#不喜欢我试图使用它,就好像它是一个float : let a = Parameter(4.0) let b = Parameter(2.0) let c = a * Math.Sin(b) <– 'expected float, here Parameter' 有没有办法做到这一点(我猜测没有,基于这个问题/答案 ),如果没有,什么是一个体面的解决方法?

使用F#代码中的C#中定义的扩展方法

我为C#库中的各种类定义了一系列扩展方法。 我目前正在编写一些F#代码,而不是重写代码,我只想在我的F#代码中使用现有的扩展方法。 我添加了对库的引用并使用open语句导入命名空间,但扩展方法没有出现在F#中

如何重构所需的else子句?

我有一个看起来有点像这样的C#方法: bool Eval() { // do some work if (conditionA) { // do some work if (conditionB) { // do some work if (conditionC) { // do some work return true; } } } return false; } 在F#中,由于强制性的其他分支,这最终看起来有点丑陋: let eval() = // do some work if conditionA then // do some work if conditionB then […]

是否可以实现递归“SelectMany”?

众所周知, Enumerable.SelectMany将一系列序列展平为单个序列。 如果我们想要一种能够使序列序列序列变平,等等递归的方法怎么办? 我很快就得到了一个使用ICollection ,即热切评估,但我仍然在考虑如何使用yield关键字制作一个懒惰评估的实现。 static List Flatten(IEnumerable list) { var rv = new List(); InnerFlatten(list, rv); return rv; } static void InnerFlatten(IEnumerable list, ICollection acc) { foreach (var elem in list) { var collection = elem as IEnumerable; if (collection != null) { InnerFlatten(collection, acc); } else { acc.Add((T)elem); } } } 有任何想法吗? 任何.NET语言欢迎中的示例。