Tag: f#

在F#中使用SqlDataReader

在C#中,我使用sql脚本将数据添加到List中,其中T将是一个具有映射到sql脚本的字段/属性的类。 我怎么能在F#中做到这一点? 这篇文章以标准方式使用存储过程。 using (conn) { conn.Open(); using (SqlCommand cmd = new SqlCommand(“dbo.query_here”, conn)) { cmd.CommandText = “dbo.query_here”; cmd.CommandType = System.Data.CommandType.StoredProcedure; cmd.CommandTimeout = 600; cmd.Parameters.Add(new SqlParameter(“@x1”, Convert.ToString(x))); cmd.Parameters.Add(new SqlParameter(“@y1”, y)); cmd.Parameters.Add(new SqlParameter(“@z1”, z)); SqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { MyListOfClasses.Add(new MyDataClass(reader.GetInt32(reader.GetOrdinal(“x”)) reader.GetDouble(reader.GetOrdinal(“y”)), reader.GetDouble(reader.GetOrdinal(“a”)), reader.GetDouble(reader.GetOrdinal(“b”)))); } reader.Close(); } conn.Close(); 我意识到F#并不像这样直截了当,但我需要以类似的方式将这些数据放入F#列表中。 也更喜欢那些本质上不起作用的建议,并遵循与C#代码类似的模式。 在之前的一个post中有人建议使用记录,但这与SqlDataReader无关。 最好有一个类列表,这样我就可以在每个项目上使用getter和setter。 我应该在不可避免的评论之前加上“为什么不只是使用C#”。 很明显我可以使用C#,但我正在探索在F#中编写算法的可能性,为此我需要从SQL […]

对F#度量单位的反思

目前已在F#中添加了对reflection的支持,但它不适用于度量类型。 是否可以在F#中使用reflection来测量类型? 我读过这个 。 那是在2008年,但是如果你在ildasm中检查一些像bellow这样的代码,你就看不到任何关于Units of Measure 。 // Learn more about F# at http://fsharp.net [] type m [] type cm let CalculateVelocity(length:float ,time:float) = length / time ildasm输出: .method public static float64 CalculateVelocity(float64 length, float64 time) cil managed { // Code size 5 (0x5) .maxstack 4 IL_0000: nop IL_0001: ldarg.0 IL_0002: ldarg.1 IL_0003: div […]

是否可以在单个Visual Studio Windows控制台项目中混合使用.cs(C#)和.fs(F#)文件? (。净)

怎么做? 是否可以在不使用分离的dll文件或项目的情况下将函数从一个F#代码调用到C#中?

如何在F#中定义T 的类型扩展名?

在C#中,我可以为类型为T的generics数组定义一个扩展方法,如下所示: public static T GetOrDefault(this T[] arr, int n) { if (arr.Length > n) { return arr[n]; } return default(T); } 但对于我的生活,我无法弄清楚如何在F#中做同样的事情! 我尝试type ‘a array with , type array with并type ‘a[] with ,编译器对它们中的任何一个都不满意。 任何人都可以告诉我在F#中这样做的权利是什么? 当然,我可以通过掩盖arrays模块并为此轻松添加function来实现这一点,但我真的想知道如何将其作为扩展方法!

如何使用F#中的C#对象?

我有以下C#代码。 namespace MyMath { public class Arith { public Arith() {} public int Add(int x, int y) { return x + y; } } } 我想出了名为testcs.fs的F#代码来使用这个对象。 open MyMath.Arith let x = Add(10,20) 当我运行以下命令时 fsc -r:MyMath.dll testcs.fs 我收到此错误消息。 /Users/smcho/Desktop/cs/namespace/testcs.fs(1,13):错误FS0039:命名空间’Arith’是 没有定义的 /Users/smcho/Desktop/cs/namespace/testcs.fs(3,9):错误FS0039:值或构造函数 “添加”未定义 可能有什么问题? 我使用mono for .NET环境。

即使所有项目都引用4.3.1,.NET运行时也会尝试加载FSharp.Core 4.3.0

我在F#中创建了一个针对F#3.1运行时的项目(即FSharp.Core版本4.3.1)。 然后我创建了一个控制台C#应用程序,为我的F#项目添加了项目引用,添加了对FSharp.Core.dll 4.3.1的引用。 一切都编译没有任何错误或警告,但运行时抛出这个当我尝试使用F#项目中的任何类型时: System.IO.FileLoadException : Could not load file or assembly ‘FSharp.Core, Version=4.3.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a’ or one of its dependencies. The located assembly’s manifest definition does not match the assembly reference. 当我的所有项目都参考4.3.1时,为什么它会搜索FSharp.Core 4.3.0? 如果我将所有项目引用从4.3.1更改为4.3.0,那么一切都会正常工作,但是版本4.3.1是什么? PS两个项目都针对.NET 4.5.1。 我正在使用Microsoft Visual Studio 2013

从C#引用异步F#数据类型

我创建了一个返回此数据类型的F#库 FSharpAsync<IEnumerable<Tupel>> 如何访问FSharpAsync类型以便我可以通过C#中的元组进行枚举并打印出内容?

重定向.Net中的stdin和stdout

我正在尝试重定向控制台应用程序的stdin和stdout,以便我可以通过F#与它们进行交互。 但是,根据控制台应用程序,明显的代码似乎失败了。 以下F#代码适用于dir但对于python和fsi失败(挂起): open System open System.Diagnostics let f = new Process() f.StartInfo.FileName <- "python" f.StartInfo.UseShellExecute <- false f.StartInfo.RedirectStandardError <- true f.StartInfo.RedirectStandardInput <- true f.StartInfo.RedirectStandardOutput <- true f.EnableRaisingEvents <- true f.StartInfo.CreateNoWindow <- true f.Start() let line = f.StandardOutput.ReadLine() 这挂起了python,但适用于dir。 这是否与使用readline的python和fsi有关,还是我犯了一个明显的错误? 有没有可以让我与F#的fsi或python REPL进行交互?

F#“​​非托管”类型约束的行为

F#支持“非托管”的类型约束。 这与“struct”约束之类的值类型约束不同。 MSDN注意到非托管约束的行为是: 提供的类型必须是非托管类型。 非托管类型是某些基本类型(sbyte,byte,char,nativeint,unativeint,float32,float,int16,uint16,int32,uint32,int64,uint64或decimal),枚举类型,nativeptr 或非通用结构,其字段都是非托管类型。 这是一个非常方便的约束类型,在进行平台调用时,我不止一次希望C#有办法做到这一点。 C#没有这个约束。 C#不支持可在CIL中指定的所有约束。 一个例子是枚举。 在C#中,你不能这样做: public void Foo(T bar) where T:enum 但是,如果在另一个库中遇到它,C#编译器确实遵守“枚举”约束。 Jon Skeet能够用它来创建他的无约束旋律项目。 所以,我的问题是,F#的“非托管”约束是什么,可以在CIL中表示,就像一个枚举约束,只是没有暴露在C#中,或者它是纯粹由F#编译器强制实施的,就像F#支持的其他一些约束(如明确的成员约束)?

F#从C#中区分联盟用法

使用C#中的F#Discriminated Unions的最佳方法是什么? 我一直在深入研究这个问题,我可能找到了最简单的方法,但由于它相当复杂,可能还有其他一些我看不到的东西…… 有一个有区别的联盟,例如: type Shape = | Rectangle of float * float | Circle of float 我发现C#的用法是(避免使用变量,使类型明显): Shape circle = Shape.NewCircle(5.0); if (circle.IsCircle) { Shape.Circle c = (Shape.Circle)circle; double radius = c.Item; } 在C#中, NewXXXX静态方法总是创建Shape类的对象,还有一个方法IsXXXX来检查对象是否属于该类型; 当且仅当它是,它可以转换为Shape.XXXX类,并且只有它的项才可访问; Shape.XXXX类的构造函数是内部的,即Shape.XXXX访问。 有人知道从一个受歧视的联盟获取数据的更简单的选择吗?