繁体   English   中英

与C#库进行F#fsharp互操作(CsvHelper)

[英]F# fsharp interop with C# library (CsvHelper)

我已经成功地使用库CsvHelper在F#中进行了一些CSV操作(我无法使用Fsharp.Data CsvProvider完成这些操作)。

在他们的文档中,他们通过以下方式操作标头:

csv.Configuration.PrepareHeaderForMatch = header => header.Replace( " ", string.Empty );

我正在尝试做类似的事情(将所有标头更改为小写),但是我还没有弄清楚如何处理该委托。

我正在尝试以下操作,但无法编译。

csv.Configuration.PrepareHeaderForMatch = (fun header -> header.ToLower())

任何帮助是极大的赞赏。

谢谢。


我尝试过@kaefer建议分配“ PrepareHeaderForMatch”的建议,因为它是C#getter; setter;。

csv.Configuration.PrepareHeaderForMatch <- fun header -> header.ToLower()

如我的评论中所述,编译器抱怨类型不匹配,因为c#属性期望:

System.Func<System.Type, string, string>

在此处输入图片说明

您看到的错误可能与类型不匹配有关,或者与不支持“相等”约束的函数类型有关。 这是因为表达式

csv.Configuration.PrepareHeaderForMatch = (fun header -> header.ToLower())

解析为运算符Microsoft.FSharp.Core.Operators.(=)的调用,左侧带有属性getter,右侧带有内联函数定义。 相反,您需要一个赋值表达式expr <- expr ,在左侧具有属性设置器调用:

csv.Configuration.PrepareHeaderForMatch <- fun header -> header.ToLower()

在F#语言中, =标记是造成混淆的常见原因,因为取决于上下文,它可以代表两种不同的含义:

  • 通用相等运算符=如上所述,或
  • 在值,函数,类型或成员定义的上下文中进行绑定,例如let x = 42

编辑原来,所讨论的属性的预期类型为System.Func<System.Type, string, string> ,这意味着您需要提供一个额外的参数,该参数随后将不再使用。 可以用通配符表示: fun _ header -> header.ToLower()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM