Question

I'm using VS 2012 Trial and the FSharp.Data library for XML parsing. When I build the project all the type provider information turns into errors - which results in refusal to compile - like:

Update - Output after trying to build (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 ==========

End update

The type 'Transaction' is not defined

and

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.

and

The field, constructor or member 'Postdate' is not defined

I have open Fharp.Data above my module and reference System.Xml.Linq.

My Solution File: https://dl.dropboxusercontent.com/u/74660436/temp3.zip

My XML File: https://dl.dropboxusercontent.com/u/74660436/KMyMoneySampleFile.xml

Sample code:

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}
Was it helpful?

Solution

Resolution: This issue has been fixed in FSharp.Data 1.1.10 (nuget). See comments below.


Update: I have the same issue using the following code:

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) = ()

Essentially, DomainTypes appear in intellisense, but the compiler gives an Error FS0039: The type 'Ul' is not defined (FS0039) error, and the same thing for 'Li'.


Original answer: I haven't got a proper answer for you, but interestingly, if you remove the <TRANSACTIONS></TRANSACTIONS> tag from your XML, it builds fine.

That is, change this:

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

to this:

<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>
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top