什么';这是使用F#Freebase类型提供程序访问链接项的正确方法

什么';这是使用F#Freebase类型提供程序访问链接项的正确方法,f#,freebase,type-providers,f#-data,F#,Freebase,Type Providers,F# Data,我有以下代码,旨在列出在Freebase上上市的证券交易所网站: #if INTERACTIVE #r @"C:\Users\kit\Documents\Visual Studio 11\Projects\Demo\packages\FSharpx.TypeProviders.1.7.4\lib\40\FSharpx.TypeProviders.dll" #r @"C:\Users\kit\Documents\Visual Studio 11\Projects\Demo\packages\FSh

我有以下代码,旨在列出在Freebase上上市的证券交易所网站:

#if INTERACTIVE
#r @"C:\Users\kit\Documents\Visual Studio 11\Projects\Demo\packages\FSharpx.TypeProviders.1.7.4\lib\40\FSharpx.TypeProviders.dll"
#r @"C:\Users\kit\Documents\Visual Studio 11\Projects\Demo\packages\FSharpx.TypeProviders.Freebase.1.7.4\lib\40\FSharpx.TypeProviders.Freebase.dll"
#r @"C:\Users\kit\Documents\Visual Studio 11\Projects\Demo\packages\FSharpx.TypeProviders.Freebase.1.7.4\lib\40\FSharpx.TypeProviders.Freebase.DesignTime.dll"
#endif 

let GetExchanges() =
    let dc = FreebaseData.GetDataContext()
    dc.DataContext.SendingRequest.Add(fun e -> printfn "url: %s" e.RequestUri.AbsoluteUri)

    dc.``Products and Services``.Business.``Stock exchanges``
    |> Seq.truncate 10
    |> Seq.iter (fun exchange -> printfn "Exchange: %s" exchange.Name
                                 exchange.``Official website``
                                 |> Seq.iter (fun site -> printfn "%s" site.Name))
{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "badRequest",
    "message": "Can't reverse /common/topic/official_website as it expects /type/uri, not an object"
   }
  ],
  "code": 400,
  "message": "Can't reverse /common/topic/official_website as it expects /type/uri, not an object"
 }
}
没有最后两行(即只列出交换名称),代码运行良好。有了这些线路,我得到了400(糟糕的请求)

该行生成的URL如下所示:

…如果我浏览到它,我会从Freebase获得以下信息:

#if INTERACTIVE
#r @"C:\Users\kit\Documents\Visual Studio 11\Projects\Demo\packages\FSharpx.TypeProviders.1.7.4\lib\40\FSharpx.TypeProviders.dll"
#r @"C:\Users\kit\Documents\Visual Studio 11\Projects\Demo\packages\FSharpx.TypeProviders.Freebase.1.7.4\lib\40\FSharpx.TypeProviders.Freebase.dll"
#r @"C:\Users\kit\Documents\Visual Studio 11\Projects\Demo\packages\FSharpx.TypeProviders.Freebase.1.7.4\lib\40\FSharpx.TypeProviders.Freebase.DesignTime.dll"
#endif 

let GetExchanges() =
    let dc = FreebaseData.GetDataContext()
    dc.DataContext.SendingRequest.Add(fun e -> printfn "url: %s" e.RequestUri.AbsoluteUri)

    dc.``Products and Services``.Business.``Stock exchanges``
    |> Seq.truncate 10
    |> Seq.iter (fun exchange -> printfn "Exchange: %s" exchange.Name
                                 exchange.``Official website``
                                 |> Seq.iter (fun site -> printfn "%s" site.Name))
{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "badRequest",
    "message": "Can't reverse /common/topic/official_website as it expects /type/uri, not an object"
   }
  ],
  "code": 400,
  "message": "Can't reverse /common/topic/official_website as it expects /type/uri, not an object"
 }
}

我是否使用正确的方法访问链接实体?如果是,这是类型提供程序中的错误吗?访问其他链接实体时,我也会遇到类似的错误。

这是类型提供程序中的一个错误,现已修复:

正如错误所述,您不能反转作为基本值属性的属性。您需要将查询翻过来,使其看起来像:

[{
  "/type/object/id": "/en/amex",
  "/common/topic/official_website": [{
    "value":    null,
    "optional": true
  }]
}]​

该库必须具备一些基本值的知识,因此可能只需将/type/uri添加到包含/type/text、/type/rawstring等的任何列表中即可。

太好了,谢谢。我想这是我开始学习如何编写/维护类型提供程序的一种方法。如果今天早上我没有听到更多的消息,我会记下答案的。你说得对。这确实是一条一模一样的直线。已修复并提交拉取请求。谢谢要是我能把两件事作为答案就好了。真高兴这么简单。如果不是为了获得一个F#*ing开发环境而苦苦挣扎的话,我自己也会提交pull请求。似乎所有的微软产品都只是试用版,既不是fsharpx也不是FSharp。数据可以用开源的F#工具构建。需要预先警告的是,还缺少其他的基元类型。请参阅最近有一个对FSharp.Data的拉取请求,以使其在Mono下编译和运行。这里还有免费版本的F#工具: