在构建项目时,“类型提供者”无法识别

时间:2013-08-26 22:13:27

标签: f# type-providers f#-data

我正在使用VS 2012 TrialFSharp.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}

1 个答案:

答案 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>