无法编译此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
}
答案 0 :(得分:2)
'产品:&gt;'在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&lt;&gt;的别名)
F#中的t.Text = new_text
也不是赋值,而是相等测试。如果要为可变变量赋值,则应使用赋值运算符:t.Text <- new_text