2014-10-01 120 views
2

无法编译此F#代码,因为它不正确地从C#中转换。无法编译此F#代码

似乎存在与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

您应该确保包含确切的错误消息及其发生的行。 – crashmstr 2014-10-01 16:05:02

+0

欢迎!请包括您得到的确切错误。 – 2014-10-01 16:05:13

+0

错误意外的符号表达式中的'(',第14行, 错误绑定中的意外符号')'。在此点或其他标记之前或之前预期的不完整结构化构造。 \t第14行, 错误意外的符号'('在表达式中,第21行,错误意外的符号')'在绑定中。在此点或其他标记之前或之前预期的不完整结构化构造。 \t第21行 – 2014-10-01 16:16:35

回答

2

一个问题“:>”在F#是铸造操作者,其转换类型键入处于较高分层。这不是一个lambda表达式。所以可能这个调用

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

应该使用F#lambda语法改写为

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

。 也肯定这需要像“R”参数类型注释:

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

LINQ的扩展方法通常看起来丑陋在F#所以最好使用功能从Collection.Seq模块:http://msdn.microsoft.com/en-us/library/ee353635.aspx(SEQ是别名IEnumerable <> in F#)

另外F#中的t.Text = new_text不是赋值而是相等性测试。如果您想为可变变量指定一个新值,您应该使用赋值运算符:t.Text <- new_text

+0

我不同意使用'Seq'函数通常会更好 - 如果代码使用表达式树来编译查询,那么'Seq'函数会做出非常不同的事情。 – kvb 2014-10-01 20:36:31

+0

@kvb是的,但在简单过滤或映射的情况下F#函数具有很强的可读性 – Petr 2014-10-01 20:43:10