Tag: f#

F#内联如何工作?

使用F#,我理解您可以使用inline关键字在呼叫站点执行类型特化。 那是:: val inline (+) : ^a -> ^b -> ^c when (^a or ^b) : (static member (+) : ^a * ^b -> ^c) 约束^a或^b必须具有静态成员,如op_Addition或其中一个内置基元,可用于填补空白。 因此,如果你有一个方法有一个+,你传入一个int和一个short作为参数,它解包+一个指令使用int的内置原语,如果你传入一个浮点数和一个字节,它使用浮点数原始加法操作码。 这在编译时是如何完成的? 你怎么能在CLR中有一个方法根据类型切换它使用的操作码或方法? Reflection.Emit可以实现这种行为吗? 我知道内联是在调用站点执行的,这是否意味着代码不能与C#一起使用?

F#struct构造函数中的参数validation

这是一个简单的C#结构,它对ctor参数进行了一些validation: public struct Foo { public string Name { get; private set; } public Foo(string name) : this() { Contract.Requires(name.StartsWith(“A”)); Name = name; } } 我已成功将其翻译成F#类: type Foo(name : string) = do Contract.Requires (name.StartsWith “A”) member x.Name = name 但是,我无法将其转换为F#中的结构: [] type Foo = val Name : string new(name : string) = { do Contract.Requires […]

C#中的委托与F#中的第一类值有什么区别?

更具体地说,代表具有作为F#中的第一类值的函数的特征(如果有的话)没有; 作为第一类值的特征有什么特征(如果有的话)在C#中委托没有?

C#和F#lambda表达式代码生成

让我们看看F#为简单函数生成的代码: let map_add valueToAdd xs = xs |> Seq.map (fun x -> x + valueToAdd) 生成的lambda表达式代码(F#function值的实例)如下所示: [Serializable] internal class map_add@3 : FSharpFunc { public int valueToAdd; internal map_add@3(int valueToAdd) { this.valueToAdd = valueToAdd; } public override int Invoke(int x) { return (x + this.valueToAdd); } } 看看几乎相同的C#代码: using System.Collections.Generic; using System.Linq; static class Program { […]

.NET 4垃圾收集器的可伸缩性

我最近对.NET 4垃圾收集器进行了基准测试,从多个线程中集中分配。 当分配的值记录在一个数组中时,我没有像我预期的那样观察到没有可伸缩性(因为系统争用对共享旧代的同步访问)。 但是,当分配的值立即被丢弃时,我惊恐地发现没有可扩展性! 我曾预计临时案例几乎是线性扩展的,因为每个线程应该简单地擦除托儿所gen0干净并重新开始而不争用任何共享资源(没有任何东西幸存到老一代并且没有L2缓存未命中因为gen0很容易适合L1缓存)。 例如, 这篇MSDN文章说 : 无同步分配在多处理器系统上,托管堆的第0代将被分成多个内存竞技场,每个线程使用一个竞技场。 这允许多个线程同时进行分配,因此不需要对堆进行独占访问。 任何人都可以validation我的发现和/或解释我的预测和观察之间的这种差异吗?

F#映射到C#字典

我正在尝试将F#地图转换为C#字典,到目前为止我正在使用: let toDictionary (map : Map) : Dictionary = let dict = new Dictionary() map |> Map.iter (fun kv -> dict.Add(k, v)) dict 它只是感觉有点笨重,我对F#很新,所以有更好的方法吗?

函数式语言编译器优于命令式语言编译器的优点

作为这个问题的后续内容F#内置不变性对C#有什么好处? –am我正确地假设F#编译器可以在知道它处理很大程度上不可变的代码时进行某些优化吗? 我的意思是,即使开发人员编写“Functional C#”,编译器也不会知道开发人员试图编写的所有不可变性,因此它无法进行相同的优化,对吧? 通常情况下,函数式语言的编译器能够进行使用命令式语言无法实现的优化 – 即使是尽可能多的不可写性编写的语言?

什么是F#缺乏OO或势在必行?

很多时候我听说F#不适合特定的任务,比如UI。 “使用正确的工具”是一个常见的短语。 除了缺少WinForms / WPF / ORM设计器等工具之外,我不确定F#到底缺少什么 – 老实说! 然而,特别是在UI方面,我被告知C#做得更好。 那么,在强制使用F#时,F#的实际差异和遗漏是什么? 这是我提出的列表: 大量缺少工具支持 F#仍然是测试版 你的开发人员不知道F# 我不想考虑这些要点,因为它们并不是F#的内在特征。 Mutable需要“可变”或需要ref,ref需要! 解除引用 Mutables赋值< – 和ref使用:=(它们都是1个字符而不仅仅是=) val需要DefaultValueAttribute来获取默认值 F#不会发出隐式接口 受保护的成员更难以处理 没有自动属性 抽象类上实现的虚拟成员需要两个定义 引用到LINQ-Expression-Trees会产生与C#/ VB略有不同的树(对于期望以特定格式表达其表达式的API而言很烦人) 没有stackalloc F#没有?:条件运算符 F#中的指针可能被认为更麻烦 代表/事件可能被认为更加繁琐(我认为它们更容易,但至少它们是不同的) 没有自动类型转换(比如int to float或者隐式转换) Nullable没有特殊的语法支持(C#的?类型注释和??运算符,以及在nullable上使用运算符。) 没有自动向上扩展到普通基类或装箱(例如:让x:obj =如果为真,那么其他为“hi”//这不会是类型检查) 没有警告就不能丢弃值(“忽略”以绕过它) 没有C风格的语法:) 问题:哪些是编写命令式或OO代码的障碍? 为什么(简短的例子)? 我错过了哪些? 什么是最好的解决方法,为什么他们还不够? 请注意 ,我不是在谈论编写所谓的惯用语F#,我当然不是在谈论函数式编程。 我更感兴趣的是“如果我要强迫自己在F#中编写UI或命令式/ OO代码,使用F#OO /命令式function和类类型,最痛苦的是什么?” 奖励如果您不了解F#但使用C#或VB.NET并认为它是某种情况下更好的工具,请指出您觉得有吸引力的特定语言function和语法。

.Net中可用的并行技术

我是.Net平台的新手。 我做了一个搜索,发现有几种方法可以在.Net中进行并行计算: 任务并行库中的并行任务,即.Net 3.5。 PLINQ,.Net 4.0 Asynchounous Programming,.Net 2.0,(async主要用于执行I / O繁重的任务,F#有一个简洁的语法支持这个)。 我列出这个是因为在Mono中,似乎没有TPL或PLINQ。 因此,如果我需要编写跨平台并行程序,我可以使用async。 .Net线程。 没有版本限制。 您能否对这些做一些简短评论或在此列表中添加更多方法?

使用静态类型语言处理异构数据(F#)

F#的一个主张是它允许交互式脚本和数据操作/探索。 我一直在玩F#试图了解它与Matlab和R在数据分析工作中的比较。 显然,F#没有这些生态系统的所有实用function,但我对底层语言的一般优点/缺点更感兴趣。 对我而言,即使在function风格方面,最大的变化是F#是静态类型的。 这有一些吸引力,但也经常感觉像一件紧身衣。 例如,我还没有找到一种处理异构矩形数据的便捷方法 – 想想R中的dataframe。假设我正在读取一个带有名称(字符串)和权重(浮点数)的CSV文件。 通常我会加载数据,执行一些转换,添加变量等,然后运行分析。 在R中,第一部分可能看起来像: df <- read.csv('weights.csv') df$logweight <- log(df$weight) 在F#中,我不清楚应该使用什么结构来做到这一点。 据我所知,我有两个选择:1)我可以先定义一个强类型的类(专家F#9.10)或2)我可以使用异构容器,如ArrayList。 静态类型的类似乎不可行,因为我需要在加载数据后以ad-hoc方式(logweight)添加变量。 异构容器也很不方便,因为每次访问变量时我都需要将其解包。 在F#中: let df = readCsv(“weights.csv”) df.[“logweight”] = log(double df.[“weight”]) 如果这是一次或两次,它可能没问题,但每次使用变量时指定一个类型似乎都不合理。 我经常处理调查,其中包含100个添加/删除的变量,分成新的子集并与其他dataframe合并。 我错过了一些明显的第三选择吗? 是否有一些有趣和轻松的方式来交互和操纵异构数据? 如果我需要在.Net上进行数据分析,我目前的意思是我应该使用IronPython进行所有数据探索/转换/交互工作,并且只对数字密集型部分使用F#/ C#。 F#本质上是快速和脏的异构数据工作的错误工具吗?