用于使用F#TypeProvider类型的类型注释,例如FSharp.Data.JsonProvider<>;。域名类型

用于使用F#TypeProvider类型的类型注释,例如FSharp.Data.JsonProvider<>;。域名类型,f#,type-providers,type-parameter,f#-data,F#,Type Providers,Type Parameter,F# Data,我正在使用FSharp.Data.JsonProvider阅读Twitter推文 使用此示例代码 我想用 let expandUrl (txt:string) (url:Search.DomainTypes<...>.DomainTypes.Url) = txt.Replace( url.Url, url.ExpandedUrl ) 我的问题是如何在上面的expandUrl函数中为url定义TypeProvider类型 类型推断向我展示了这一点 val urls : F

我正在使用
FSharp.Data.JsonProvider
阅读Twitter推文

使用此示例代码

我想用

let expandUrl (txt:string) (url:Search.DomainTypes<...>.DomainTypes.Url) = 
    txt.Replace( url.Url, url.ExpandedUrl )
我的问题是如何在上面的expandUrl函数中为url定义
TypeProvider
类型

类型推断向我展示了这一点

val urls : FSharp.Data.JsonProvider<...>.DomainTypes.Url []
val Url:FSharp.Data.JsonProvider.DomainTypes.Url[]
但在类型声明中不接受这一点。我想“”不是F#synatx

如何使用类型提供程序类型进行类型注释,例如
FSharp.Data.JsonProvider.DomainTypes.Url?

以下是完整的代码片段:

open TwitterAPI // github.com/tpetricek/Documents/tree/master/Samples/Twitter.API 
let twitter = TwitterAPI.TwitterContext( _consumerKey, _consumerSecret, _accessToken, _accessTokenSecret )
let query = "water"
let ts = Twitter.Search.Tweets(twitter, Utils.urlEncode query, count=100)

let ret = 
  [ for x in ts.Statuses do
      // val urls : FSharp.Data.JsonProvider<...>.DomainTypes.Url []
      let urls = x.Entities.Urls 
      // fully declarated to help the type inference at expandUrl
      let replace (txt:string) (oldValue:string) (newValue:string) = 
          txt.Replace( oldValue, newValue)
      // Error:
      // 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.
      let expandUrl (txt:string) (url:FSharp.Data.JsonProvider<_>.DomainTypes.Url) = 
          replace txt url.Url url.ExpandedUrl
      let textWithExpandedUrls = Array.fold expandUrl x.Text urls
      yield textWithExpandedUrls
  ]
opentwitterapi//github.com/tpetricek/Documents/tree/master/Samples/Twitter.API
让twitter=TwitterAPI.TwitterContext(\u consumerKey、\u ConsumerCret、\u accessToken、\u accessTokenSecret)
让query=“水”
让ts=Twitter.Search.Tweets(Twitter,Utils.urlEncode查询,count=100)
让ret=
[对于ts中的x,状态为do
//val Url:FSharp.Data.JsonProvider.DomainTypes.Url[]
让URL=x.Entities.URL
//完全声明以帮助在expandUrl进行类型推断
让我们替换(txt:string)(oldValue:string)(newValue:string)=
txt.Replace(旧值、新值)
//错误:
//基于此程序点之前的信息查找不确定类型的对象。
//在此程序点之前可能需要类型注释来约束对象的类型。
//这样可以解决查找问题。
让expandUrl(txt:string)(url:FSharp.Data.JsonProvider.DomainTypes.url)=
替换txt url.url url.ExpandedUrl
让textWithExpandedUrls=Array.fold expandUrl x.Text URL
使用ExpandedUrls生成文本
]

当您调用
Twitter.Search.Tweets
()时,它的返回类型是
TwitterTypes.SearchTweets
的域类型之一,它是
JsonProvider
()的类型别名


尽管在工具提示中它显示为
JsonProvider.DomainTypes.Url
,但您必须使用类型别名
TwitterTypes.SearchTweets.DomainTypes.Url

,我在尝试找出如何使用
FSharp.Data HtmlProvider
时遇到了类似的问题

我正在使用维基百科获取有关美国的信息。
HtmlProvider
在发现该网页中的各种表格方面做得很好,但我想将处理一行“总统数据”的逻辑提取到一个名为
processRow
的单独函数中

问题是试图找出
processRow
的参数
row
的此类行的类型。下面的代码实现了这一点:

#load "Scripts\load-references.fsx"

open FSharp.Data

let presidents = new HtmlProvider<"https://en.wikipedia.org/wiki/List_of_Presidents_of_the_United_States">()

let ps = presidents.Tables.``List of presidents``

ps.Headers |> Option.map (fun hs -> for h in hs do printf "%s " h)

printfn ""

type Presidents = ``HtmlProvider,Sample="https://en.wikipedia.org/wiki/List_of_Presidents_of_the_United_States"``.ListOfPresidents

let processRow (row:Presidents.Row) =
  printfn "%d %s" row.``№`` row.President2

ps.Rows |> Seq.iter processRow
#加载“脚本\加载引用.fsx”
打开FSharp.Data
let presidents=new HtmlProvider()
设ps=presidents.Tables.`List of presidents``
ps.Headers |>Option.map(在hs-do-printf“%s”h中,fun-hs->for-h)
打印fn“”
键入Presidents=`HtmlProvider,Sample='https://en.wikipedia.org/wiki/List_of_Presidents_of_the_United_States“``.客户名单
let processRow(行:Presidents.row)=
打印fn“%d%s”行``№`` 第二排主席
ps.行|>序号iter processRow

我没有为
总统
键入长类型别名,我使用Visual Studio自动补全功能,通过猜测
总统列表
的类型可以从以
Html
开头的内容中发现,它是由四个单引号完成的。

是不是F#语法,对于泛型类型,F#使用下划线,但我认为这不适用于这里。你能发布一段你试图解析的JSON吗?我已经试过了。然后u和url.url url.ExpandedUrl会出现红色的曲线。也不可能按深入查看FSharp.Data.JsonProvider之后的类型。“点浏览”。我添加了问题代码的链接。我还添加了完整的代码片段。谢谢,这很有效!为什么类型推断不能向我显示正确的工具提示?或者我错过了什么。是的,这可能是可以改进的
#load "Scripts\load-references.fsx"

open FSharp.Data

let presidents = new HtmlProvider<"https://en.wikipedia.org/wiki/List_of_Presidents_of_the_United_States">()

let ps = presidents.Tables.``List of presidents``

ps.Headers |> Option.map (fun hs -> for h in hs do printf "%s " h)

printfn ""

type Presidents = ``HtmlProvider,Sample="https://en.wikipedia.org/wiki/List_of_Presidents_of_the_United_States"``.ListOfPresidents

let processRow (row:Presidents.Row) =
  printfn "%d %s" row.``№`` row.President2

ps.Rows |> Seq.iter processRow