我正在使用VS 2012 Trial
和FSharp.Data
库进行XML
解析。当我构建项目时,所有类型提供者信息都会变成错误 - 导致拒绝编译 - 如:
更新 - 尝试构建后的输出(Framework 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}
答案 0 :(得分:2)
解决方案:此问题已在FSharp.Data 1.1.10(nuget)中修复。见下面的评论。
更新:我使用以下代码遇到同样的问题:
module XmlTypeProviderIssue
open System
open FSharp.Data
type Html = XmlProvider<"""
<div>
<span>
<ul>
<li/>
</ul>
</span>
</div>""">
let html = Html.GetSample()
// Div is defined
let divWorks (div:Html.DomainTypes.Div) = ()
// Span is defined
let spanWorks (span:Html.DomainTypes.Span) = ()
// Ul is not
let ulBreaks (ul:Html.DomainTypes.Ul) = ()
// and neither is Li
let liBreaks (li:Html.DomainTypes.Li) = ()
基本上,DomainTypes出现在intellisense中,但编译器会出现Error FS0039: The type 'Ul' is not defined (FS0039)
错误,而对于'Li'也是如此。
原始回答:
我没有得到适当的答案,但有趣的是,如果从XML中删除<TRANSACTIONS></TRANSACTIONS>
标记,它就可以正常构建。
即改变这一点:
<TRANSACTIONS count="2">
<TRANSACTION postdate="2005-01-05" commodity="USD" memo="" id="T000000000000001557" entrydate="2013-07-03">
<SPLITS>
<SPLIT payee="P000015" reconcileflag="0" shares="-121041/100" reconciledate="" action="Withdrawal" bankid="" account="A000106" number="" value="-121041/100" memo="" id="S0001"/>
<SPLIT payee="P000015" reconcileflag="0" shares="121041/100" reconciledate="" action="" bankid="" account="A000006" number="" value="121041/100" memo="" id="S0002"/>
</SPLITS>
</TRANSACTION>
<TRANSACTION postdate="2005-01-05" commodity="USD" memo="" id="T000000000000001557" entrydate="2013-07-03">
<SPLITS>
<SPLIT payee="P000015" reconcileflag="0" shares="-121041/100" reconciledate="" action="Withdrawal" bankid="" account="A000106" number="" value="-121041/100" memo="" id="S0001"/>
<SPLIT payee="P000015" reconcileflag="0" shares="121041/100" reconciledate="" action="" bankid="" account="A000006" number="" value="121041/100" memo="" id="S0002"/>
</SPLITS>
</TRANSACTION>
</TRANSACTIONS>
到此:
<TRANSACTION postdate="2005-01-05" commodity="USD" memo="" id="T000000000000001557" entrydate="2013-07-03">
<SPLITS>
<SPLIT payee="P000015" reconcileflag="0" shares="-121041/100" reconciledate="" action="Withdrawal" bankid="" account="A000106" number="" value="-121041/100" memo="" id="S0001"/>
<SPLIT payee="P000015" reconcileflag="0" shares="121041/100" reconciledate="" action="" bankid="" account="A000006" number="" value="121041/100" memo="" id="S0002"/>
</SPLITS>
</TRANSACTION>
<TRANSACTION postdate="2005-01-05" commodity="USD" memo="" id="T000000000000001557" entrydate="2013-07-03">
<SPLITS>
<SPLIT payee="P000015" reconcileflag="0" shares="-121041/100" reconciledate="" action="Withdrawal" bankid="" account="A000106" number="" value="-121041/100" memo="" id="S0001"/>
<SPLIT payee="P000015" reconcileflag="0" shares="121041/100" reconciledate="" action="" bankid="" account="A000006" number="" value="121041/100" memo="" id="S0002"/>
</SPLITS>
</TRANSACTION>