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}