我正在使用VS 2012 Trial
和FSharp.Data
库进行XML
解析。当我构建项目时,所有类型提供程序信息都会变成错误 - 这导致拒绝编译 - 例如:
更新 - 尝试构建后的输出(框架 4.5)
------ Build started: Project: temp3, Configuration: Debug Any CPU ------
C:\Program Files (x86)\Microsoft SDKs\F#\3.0\Framework\v4.0\fsc.exe
-o:obj\Debug\temp3.dll -g --debug:full --noframework --define:DEBUG
--define:TRACE --doc:bin\Debug\temp3.XML --optimize- --tailcalls-
-r:"C:\Program Files (x86)\Reference Assemblies\Microsoft\FSharp\3.0\Runtime\v4.0\FSharp.Core.dll"
-r:C:\Users\Laura\BTSync\Dropbox\VisualStudio\Projects\temp3\packages\FSharp.Data.1.1.9\lib\net40\FSharp.Data.DesignTime.dll
-r:C:\Users\Laura\BTSync\Dropbox\VisualStudio\Projects\temp3\packages\FSharp.Data.1.1.9\lib\net40\FSharp.Data.dll
-r:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\mscorlib.dll"
-r:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Core.dll"
-r:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.dll"
-r:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Numerics.dll"
-r:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Xml.Linq.dll"
--target:library --warn:3 --warnaserror:76 --vserrors --validate-type-providers
--LCID:1033 --utf8output --fullpaths --flaterrors --subsystemversion:6.00
--highentropyva+ "C:\Users\Laura\AppData\Local\Temp\.NETFramework,Version=v4.5.AssemblyAttributes.fs" Library1.fs
C:\Users\Laura\BTSync\Dropbox\VisualStudio\Projects\temp3\temp3\Library1.fs(31,122):
error FS0039: The type 'Transaction' is not defined
C:\Users\Laura\BTSync\Dropbox\VisualStudio\Projects\temp3\temp3\Library1.fs(32,21):
error FS0072: Lookup on object of indeterminate type based on information
prior to this program point.
A type annotation may be needed prior to this program point to constrain
the type of the object. This may allow the lookup to be resolved.
C:\Users\Laura\BTSync\Dropbox\VisualStudio\Projects\temp3\temp3\Library1.fs(33,85):
error FS0039: The field, constructor or member 'Postdate' is not defined
C:\Users\Laura\BTSync\Dropbox\VisualStudio\Projects\temp3\temp3\Library1.fs(34,38):
error FS0752: The operator 'expr.[idx]' has been used on an object of indeterminate
type based on information prior to this program point. Consider adding
further type constraints
C:\Users\Laura\BTSync\Dropbox\VisualStudio\Projects\temp3\temp3\Library1.fs(34,74):
error FS0752: The operator 'expr.[idx]' has been used on an object of indeterminate type
based on information prior to this program point. Consider adding further type
constraints
C:\Users\Laura\BTSync\Dropbox\VisualStudio\Projects\temp3\temp3\Library1.fs(34,118):
error FS0752: The operator 'expr.[idx]' has been used on an object of indeterminate type
based on information prior to this program point. Consider adding further type
constraints
C:\Users\Laura\BTSync\Dropbox\VisualStudio\Projects\temp3\temp3\Library1.fs(35,39):
error FS0752: The operator 'expr.[idx]' has been used on an object of indeterminate type
based on information prior to this program point. Consider adding further type
constraints
C:\Users\Laura\BTSync\Dropbox\VisualStudio\Projects\temp3\temp3\Library1.fs(35,68):
error FS0752: The operator 'expr.[idx]' has been used on an object of indeterminate type
based on information prior to this program point. Consider adding further type
constraints
C:\Users\Laura\BTSync\Dropbox\VisualStudio\Projects\temp3\temp3\Library1.fs(35,93):
error FS0752: The operator 'expr.[idx]' has been used on an object of indeterminate type
based on information prior to this program point. Consider adding further type
constraints
C:\Users\Laura\BTSync\Dropbox\VisualStudio\Projects\temp3\temp3\Library1.fs(35,125):
error FS0752: The operator 'expr.[idx]' has been used on an object of indeterminate type
based on information prior to this program point. Consider adding further type
constraints
Done building project "temp3.fsproj" -- FAILED.
Build FAILED.
========== Build: 0 succeeded or up-to-date, 1 failed, 0 skipped ==========
结束更新
The type 'Transaction' is not defined
和
Look up on object of indeterminate type based on information prior to this
program point. A type annotation may be needed prior to this program point
to constrain the type of the object. This may allow the lookup to be resolved.
和
The field, constructor or member 'Postdate' is not defined
我open Fharp.Data
上面有我的模块和参考System.Xml.Linq
。
我的解决方案文件: https ://dl.dropboxusercontent.com/u/74660436/temp3.zip
我的 XML 文件: https ://dl.dropboxusercontent.com/u/74660436/KMyMoneySampleFile.xml
示例代码:
namespace KMyMoney
open System.IO
open System.IO.Compression
open FSharp.Data
module Read =
let decompressFileAndRead sourceFile = (new StreamReader(new GZipStream(File.OpenRead(sourceFile), CompressionMode.Decompress))).ReadToEnd()
type KMyMoney = XmlProvider<"KMyMoneySampleFile.xml">
let kMyMoney (sourceData:string) = KMyMoney.Load(sourceData)
let getAccountNames sourceData =
(kMyMoney sourceData).Accounts.GetAccounts()
|> Array.map (fun acc -> acc.Id, acc.Name)
|> Map.ofArray
let getPayeeNames sourceData =
(kMyMoney sourceData).Payees.GetPayees()
|> Array.map (fun p -> p.Id, p.Name)
|> Map.ofArray
type TransactionNew = {Id:string; Commodity:string; Date:System.DateTime; Account:string option; Amount:float; Payee:string option
; Category:string option; Number:string; Memo:string; Shares:float}
let amount (value:string) =
let divideArray (values:float[]) = values.[0]/values.[1]
value.Split("/".[0]) |> Array.map float |> divideArray
let splitTransaction (accNames:Map<string,string>) (payeeNames:Map<string,string>) (transaction:KMyMoney.DomainTypes.Transaction) =
let split = transaction.Splits.GetSplits()
{Id = transaction.Id; Commodity = transaction.Commodity; Date = transaction.Postdate
; Account = accNames.TryFind(split.[0].Account); Amount = amount split.[0].Value; Payee = payeeNames.TryFind(split.[1].Payee)
; Category = accNames.TryFind(split.[1].Account); Number = split.[0].Number; Memo = split.[0].Memo; Shares = amount split.[0].Shares}