小编Aka*_*ash的帖子

记录F#代码

在具有单个构造函数的C#类中,我可以添加类摘要XML文档和构造函数XML文档:

///<summary>
///This class will solve all your problems
///</summary>
public class Awesome
{
    /// <summary>
    /// Initializes a new instance of the <see cref="Awesome"/> class.
    /// </summary>
    /// <param name="sauce">The secret sauce.</param>       
    public Awesome(string sauce)
    {
        //...implementation elided for security purposes
    }
}
Run Code Online (Sandbox Code Playgroud)

如何使用等效的F#类进行相同的操作,以使生成的文档相同?

type Awesome(sauce: string) = 
    //...implementation elided for security purposes
Run Code Online (Sandbox Code Playgroud)

澄清:我知道标准的XML文档标签可以在F#中使用.我的问题是如何将它们添加到上面的代码片段,以便记录类型和构造函数.

f# xml-documentation

23
推荐指数
3
解决办法
2469
查看次数

模式匹配语法中的歧义

我今天在F#模式匹配语法中遇到了一个奇怪的问题,这可能导致穷举检查中的明显失败.

type Thing =
    | This
    | That
    | Other

let useThing =
    function
    | This -> "A"
    | That -> "A"
    | That -> "B" // compiler complains
    | Other -> "B"
Run Code Online (Sandbox Code Playgroud)

在上面的场景中,编译器有用地告诉我第二条规则永远不会匹配.但是,如果我试图使代码更紧凑并且已经编写了

let useThing =
    function
    | This | That -> "A"
    | That | Other -> "B"    
Run Code Online (Sandbox Code Playgroud)

我没有得到编译器的任何帮助.我认为原因是它| This | That ->. "A"不是一个快捷方式| This -> "A" | That -> "A",即使它看起来非常像(并且我已经看到许多代码样本将其视为这样).相反,根据我的发现,管道符号既可用于分隔单个模式,也可用作OR模式.

对于大多数DU而言,这不是一个大问题,但是在将具有大量案例的DU映射到具有少量案例的另一个DU时遇到了问题.我尝试使用快捷语法导致了一个错误.

所以我的问题是:

  1. 我的解释是否正确?
  2. 除了在单独的行上列出每个模式之外,还有其他解决方法吗?

f#

17
推荐指数
1
解决办法
201
查看次数

F#Choice类型的用例

我已经意识到F#Choice类型已经有一段时间了,但是我想不出任何我使用它的地方而不是用有意义的命名案例定义我自己的联合类型.

MSDN文档没有提供太多建议("有两种选择的活动模式的帮助程序类型.")并且没有任何示例用法.

我必须遗漏一些东西 - 这种类型相对于自定义联盟的主要优势是什么?

f#

13
推荐指数
1
解决办法
4319
查看次数

是否可以从.NET测试COM暴露的程序集?

我有一个.NET程序集,我通过tlb文件向COM公开,以及一个注册tlb的安装程序.我已手动检查安装程序是否正常工作,并且COM客户端可以访问该库.到现在为止还挺好...

但是,我正在尝试组合一些自动系统测试,检查安装程序是否正常工作.作为其中的一部分,我已经在VM上自动安装,我现在想要对已安装的COM库进行一些调用以验证它是否正常工作.我最初想过在VB6中编写一些测试,但我已经有了一大堆用C#编写的测试,它引用了.NET程序集.我希望我可以更改这些以引用.tlb,但是当我在VS2008中尝试这个时出现错误:

ActiveX类型库'blah.tlb'是从.NET程序集导出的,无法添加为引用.

有什么方法可以欺骗VS2008允许我添加这个引用,也许是通过编辑tlb文件?

谷歌搜索没有提出任何解决方案.我发现的只是一篇Microsoft Connect文章,声明这是"按设计":http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx ?FeedbackID = 120882

c# com interop com-interop visual-studio

11
推荐指数
1
解决办法
7247
查看次数

F#struct构造函数中的参数验证

这是一个简单的C#结构,它对ctor参数进行了一些验证:

public struct Foo
{
    public string Name { get; private set; }

    public Foo(string name)
        : this()
    {
        Contract.Requires<ArgumentException>(name.StartsWith("A"));
        Name = name;
    }
}
Run Code Online (Sandbox Code Playgroud)

我已成功将其翻译成F#类:

type Foo(name : string) = 
    do 
        Contract.Requires<ArgumentException> (name.StartsWith "A")
    member x.Name = name
Run Code Online (Sandbox Code Playgroud)

但是,我无法将其转换为F#中的结构:

[<Struct>]
type Foo = 
    val Name : string
    new(name : string) = { do Contract.Requires<ArgumentException> (name.StartsWith "A"); Name = name }
Run Code Online (Sandbox Code Playgroud)

这给出了编译错误:

无效的记录,序列或计算表达式.序列表达式应为'seq {...}'形式

这不是有效的对象构造表达式.显式对象构造函数必须调用备用构造函数或初始化对象的所有字段,并指定对超类构造函数的调用.

我已经看过这个这个,但它们不包括参数验证.

我哪里做错了?

c# f# struct c#-to-f#

11
推荐指数
2
解决办法
1051
查看次数

来自外部系统的事件采购命令或事件?

在大多数情况下,我理解命令与CQRS + ES系统中的事件之间的区别.但是,有一种情况我无法弄清楚.

假设我正在构建个人财务跟踪系统,用户可以在其中输入借方/贷方.显然这些是命令,一旦验证它们,域模型就会更新并发布一个事件.但是,假设信用/借记信息也直接来自外部系统,例如,用户的花店发送一条消息,表明他已经向用户的信用卡收取了定期交付的母亲节.在这种情况下,消息似乎是一个事件(已经发生了收费),但消息可能格式错误并且将被拒绝.它真的是一个命令吗?但是后来需要一种发送ACK/NACK的方法,这不是这里的情况(花店只有在知道借记已经发生时才发送消息).

编辑:只是为了澄清,我不是在谈论外部系统对我的事件和/或命令的了解.我有一个组件从外部系统接收数据,然后必须发布事件或发送命令.问题是,我的组件应该使用哪个事件或命令?

cqrs event-sourcing

10
推荐指数
1
解决办法
1785
查看次数

接口中的Tupled参数

有人可以解释这个F#的好奇心吗?

    type IFoo =
        abstract member Bar1: int * int -> int * int
        abstract member Bar2: int * int -> (int * int)
        abstract member Bar3: (int * int) -> int * int

    type Foo() = class end
        with 
        interface IFoo with
            member this.Bar1 (x, y) = (x, y)
            member this.Bar2 (x, y) = (x, y) // Same impl as Bar1 i.e. parentheses on RHS of -> in interface member definition are ignored
            // member this.Bar3 (x, y) = …
Run Code Online (Sandbox Code Playgroud)

f#

8
推荐指数
1
解决办法
332
查看次数

委托/ Func转换和误导性编译器错误消息

我认为F#函数和System.Func之间的转换必须手动完成,但似乎有一种情况,编译器(有时)会为你做.当出错时,错误信息不准确:

module Foo =
    let dict = new System.Collections.Generic.Dictionary<string, System.Func<obj,obj>>()

    let f (x:obj) = x

    do
        // Question 1: why does this compile without explicit type conversion?
        dict.["foo"] <- fun (x:obj) -> x 
        // Question 2: given that the above line compiles, why does this fail?
        dict.["bar"] <- f 
Run Code Online (Sandbox Code Playgroud)

最后一行无法编译,错误是:

This expression was expected to have type
    System.Func<obj,obj>    
but here has type
    'a -> obj
Run Code Online (Sandbox Code Playgroud)

显然,该功能f没有签名'a > obj.如果F#3.1编译器对第一个字典赋值感到满意,那为什么不是第二个呢?

f#

7
推荐指数
1
解决办法
208
查看次数

设计长期,资源密集型Web服务的建议

我有一个.NET函数,可以进行一些复杂的计算.根据传入的参数,函数:

  • 需要几分钟到几个小时才能运行
  • 在计算过程中使用100%的单核
  • 需要从100 MB到几GB内存的任何地方
  • 从几MB到几GB的数据写入磁盘
  • 可能会抛出异常,包括OutOfMemoryException

可以从函数参数化准确地预测要写入磁盘的数据量.没有简单的方法来预测函数参数化的其他资源需求.

我需要通过Web服务公开此功能.这项服务需要:

  • 在计算过程中灵活且优雅地报告任何问题
  • 能够处理并发请求,只要有足够的资源来处理请求而不会显着降低性能,并优先拒绝请求.

我打算通过让初始请求返回可以轮询进度的状态资源来处理长期运行的性质.计算完成后,此资源将提供输出数据的位置,客户端可以下载该位置(可能通过FTP).

我不清楚如何最好地处理其他要求.我正在考虑某种"计算池",它维护计算器的实例并跟踪当前正在使用的计算器,但我还没有弄清楚细节.

有类似情况经验的人有什么建议吗?只要解决方案可以在Windows机器上运行,就可以考虑所有技术选项.

.net web-services long-running-processes

6
推荐指数
1
解决办法
844
查看次数

支持标记联合的序列化格式

这个问题早在2012年就被问到了,但我正在寻找新的更新。

是否有任何支持带标签的联合的序列化格式(又名和类型)?我的要求是它具有Java和.Net客户端库,并且应该“合理成熟”。性能不是主要问题。

Avro提供了部分支持,但不允许嵌套的联合(http://avro.apache.org/docs/1.7.6/spec.html#Unions)。Cap'n Proto似乎有更好的支持,但我不确定它是否已准备好投入生产。Transit没有直接支持,但是提供了一种扩展机制,该机制可能能够支持带标签的联合。

还有其他建议或对以上选择的评论吗?

serialization algebraic-data-types discriminated-union

6
推荐指数
1
解决办法
633
查看次数