【问题标题】:Can't compile this F# code无法编译此 F# 代码
【发布时间】:2014-10-15 03:51:59
【问题描述】:

无法编译此 F# 代码,因为它是从 C# 错误翻译的。

lambda 表达式似乎有问题

namespace OpenXML

open DocumentFormat.OpenXml
open DocumentFormat.OpenXml.Packaging
open DocumentFormat.OpenXml.Wordprocessing
// Add the DocumentFormat.OpenXml assembly
// Add the WindowsBase assembly

module public Word =

    let query_plain_text_content_control (document_path_and_file_name :string) (content_control_tag :string) =
        use theDoc = WordprocessingDocument.Open(document_path_and_file_name, true)
        let mainPart = theDoc.MainDocumentPart
        let block = mainPart.Document.Body.Descendants<SdtElement>().Where(r :> r.SdtProperties.GetFirstChild<Tag>().Val = content_control_tag).Single()
        let t = block.Descendants<Text>().FirstOrDefault()
        t.Text

    let update_plain_text_content_control (document_path_and_file_name :string) (content_control_tag :string) (new_text :string) = async {
        use theDoc = WordprocessingDocument.Open(document_path_and_file_name, true)
        let mainPart = theDoc.MainDocumentPart
        let block = mainPart.Document.Body.Descendants<SdtElement>().Where(r :> r.SdtProperties.GetFirstChild<Tag>().Val = content_control_tag).Single()
        let t = block.Descendants<Text>().FirstOrDefault()
        t.Text = new_text
        mainPart.Document.Save() |> ignore
        }

【问题讨论】:

  • 您应该确保包含准确的错误消息以及它出现在哪一行。
  • 欢迎您!请包括您得到的确切错误。
  • 错误 1 ​​表达式中出现意外符号 '(',第 14 行,错误 2 绑定中出现意外符号 ')'。在此点或其他标记处或之前预期不完整的结构化构造。第 14 行,错误 3 表达式中出现意外符号“(”,第 21 行,错误 4 绑定中出现意外符号“)”。在此点或其他标记处或之前预期不完整的结构化构造。 21号线
  • F# 中的 ':>' 是转换运算符,可将类型转换为层次结构中较高的类型。这不是 lambda 表达式。
  • 我认为你最近的编辑已经把它变成了一个新问题——现在的答案毫无意义。我认为你最好提出一个新问题。

标签: f#


【解决方案1】:
F# 中的

':>' 是转换运算符,将类型转换为层次结构中更高的类型。它不是 lambda 表达式。所以可能这个电话

Where(r :> r.SdtProperties.GetFirstChild<Tag>().Val = content_control_tag)

应该改写成

Where(fun r -> r.SdtProperties.GetFirstChild<Tag>().Val = content_control_tag)

使用 F# lambda 语法。 当然,这也需要在 'r' 参数上进行类型注释,例如:

Where(fun (r: put_here_type_of_r) -> ...)

Linq 扩展方法在 F# 中通常看起来很难看,因此最好使用 Collection.Seq 模块中的函数:http://msdn.microsoft.com/en-us/library/ee353635.aspx(Seq 是 F# 中 IEnumerable 的别名)

F# 中的 t.Text = new_text 也不是赋值,而是相等测试。如果你想为可变变量分配一个新值,你应该使用赋值运算符:t.Text &lt;- new_text

【讨论】:

  • 我不同意使用 Seq 函数通常更好 - 如果代码使用表达式树来编译查询,那么 Seq 函数会做一些非常不同的事情。
  • @kvb 是的,但在简单过滤或映射的情况下,F# 函数可读性更强
猜你喜欢
  • 1970-01-01
  • 2012-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-08
相关资源
最近更新 更多