Я использую 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}
#r
для ссылки на библиотеку оттуда. Затем проверьте, появилось ли сообщение об ошибке в строке#r
. - person Tomas Petricek   schedule 28.08.2013