我有以下代码片段,用于评估XML文件:
open System
open System.IO
open System.Xml.Linq
open FSharp.Data
open System.Net
type InputXml = XmlProvider<"C:\Temp\sample.xml">
[<EntryPoint>]
let main argv =
let input = InputXml.Load("C:\Temp\sample.xml")
for customer in input.GetCustomers() do
for order in customer.GetOrders() do
for line in order.GetOrderLines() do
printfn "Customer: %s, Order: %s, Item: %s, Quantity: %d"
customer.Name order.Number line.Item line.Quantity
Console.ReadLine() |> ignore
0 // return an integer exit code
编译器显示以下错误:
Error 1 This expression was expected to have type
int
but here has type
unit D:\f#\samples\Program.fs 16 5 samples
为什么呢?我做错了什么?
答案 0 :(得分:2)
F#是用空格分隔的。这意味着:
for customer in input.GetCustomers() do
for order in customer.GetOrders() do
for line in order.GetOrderLines() do
需要更像这样:
for customer in input.GetCustomers() do
for order in customer.GetOrders() do
for line in order.GetOrderLines() do
否则第一个for
正文的范围将持续到当前缩进级别(包括0
)结束。您可以使用旧式语法通过执行以下操作来解决此问题:
for customer in input.GetCustomers() do
for order in customer.GetOrders() do
for line in order.GetOrderLines() do
...
done
done
done
0
但此时此高度非惯用。