Tag: c# to f#

实现C#方法返回F#中的Task

我在F#中创建了一个inheritance自C#类的类型,该类公开了一个在C#中返回Task的方法。 我正在尝试找出在F#中做到这一点的最佳方式 说我的C#看起来像这样: public class Foo { public TextWriter Out { get { return Console.Out; } } public virtual Task DoStuff() { return Task.FromResult(SomeEnum.Foo); } } public enum SomeEnum { Foo, Bar } 我在F#中inheritance该类型的第一步看起来像这样: type Bar() = inherits Foo() override this.DoStuff() = this.Out.WriteLineAsync(“hey from F#”) |> ignore System.Threading.Task.FromResult(SomeEnum.Bar) 但是a)它不觉得它实际上是异步的并且b)它只是感觉不是-F#。 那么我将如何inheritanceFoo类并实现期望返回Task的DoStuff方法?

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#中的Euler 23:0.2秒,F#:30.5秒。 为什么?

我对这个问题的F#解决方案并不满意,因为我找不到一个漂亮而快速的解决方案,但这不是问题所在。 问题是,我将解决方案转换为C#以获得它,而且速度很快。 比如,非常快,相对而言。 我无法弄清楚为什么。 是的,我去过Reflector,C#代码看起来非常相似,不能说我真的了解IL但它看起来有点像。 我唯一能想到的是F#int []对C#List的表现。 所以这里: F# module Euler023 let divisorsSum n = let mutable sum = 1 let limit = (int (sqrt(float n))) for i in [2..limit] do if n%i=0 then sum x let abundants = [1..28123] |> List.filter isAbundant |> List.toArray let domain = System.Collections.BitArray(28124) let rec loopUntil ij = if […]

单声道:有没有System.Tuple?

我想在Mono中做一些C#和F#之间的互操作。 Mono C#中是否有System.Tuple? 我可以在Mono.CSharp中看到一个,但这似乎与F#(a’* b’)的类型不同。 所以, (a)Mono C#中是否有System.Tuple或(b)Mono C#和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访问。 有人知道从一个受歧视的联盟获取数据的更简单的选择吗?

C#中的Agent / MailboxProcessor使用新的async / await

这个问题结合了我不完全理解的两个主题 通过阅读关于F#中的异步的文章 ,我遇到了Agent / MailboxProcessors的主题,它可用于实现被动状态机。 是否可以使用C#5中的新异步/等待function来实现C#中类似的function,或者是否已经存在更适合的类似模拟?

将异步 – 等待C#代码转换为与调度程序相关的F#

我想知道这是否是一个太广泛的问题,但最近我让自己遇到了一段代码,我想确定如何从C#转换为适当的F#。 旅程从这里开始(1) (TPL-F#交互的原始问题),并继续这里(2) (我正在考虑转换为F#的一些示例代码)。 示例代码在这里重现的时间太长,但有趣的函数是ActivateAsync , RefreshHubs和AddHub 。 特别有趣的是 AddHub具有private async Task AddHub(string address)的签名。 RefreshHubs在一个循环中调用AddHub并收集一个tasks列表,然后通过await Task.WhenAll(tasks)它最终await Task.WhenAll(tasks) ,因此返回值与其private async Task RefreshHubs(object _)签名相匹配。 RefreshHubs由ActivateAsync调用,就像await RefreshHubs(null) ,最后有一个调用await base.ActivateAsync()匹配函数签名public override async Task ActivateAsync() 。 题: 将这些函数签名正确转换为F#仍然保持接口和function并尊重默认的自定义调度程序是什么? 我也不太确定这个“在F#中异步/等待”。 至于如何“机械地”做到这一点。 🙂 原因是在链接“here(1)”中似乎存在问题(我没有validation过),因为F#异步操作不遵循(Orleans)运行时设置的自定义协作调度程序。 此外, 这里指出TPL操作逃脱调度程序并转到任务池,因此禁止使用它们。 我能想到解决这个问题的一种方法是使用F#函数,如下所示 //Sorry for the inconvenience of shorterned code, for context see the link “here (1)”… override […]

C#和F#强制转换 – 特别是’as’关键字

在C#我可以这样做: var castValue = inputValue as Type1 在F#中,我可以这样做: let staticValue = inputValue :> Type1 let dynamicValue = inputValue :?> Type1 但它们都不等同于C#的关键字。 我想我需要为F#中的等价物做一个匹配表达式 match inputValue with | 😕 Type1 as type1Value -> type1Value | _ -> null 它是否正确?