我正在使用FSharp.Data.JsonProviderTwitter推文.
使用此示例代码 https://github.com/tpetricek/Documents/tree/master/Samples/Twitter.API
我想扩展推文中的网址
let expandUrl (txt:string) (url:Search.DomainTypes<...>.DomainTypes.Url) =
txt.Replace( url.Url, url.ExpandedUrl )
Run Code Online (Sandbox Code Playgroud)
这会导致错误:
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.
Run Code Online (Sandbox Code Playgroud)
我的问题是如何TypeProvider在上面的expandUrl函数中定义url 的类型?
类型感染告诉我这个
val urls : FSharp.Data.JsonProvider<...>.DomainTypes.Url []
Run Code Online (Sandbox Code Playgroud)
但是在类型声明中不接受这一点.我假设"<...>"不是F#synatx.
如何使用TypeProvider类型进行类型注释,例如 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" …Run Code Online (Sandbox Code Playgroud) 我正在尝试将数据从FSharp.Data.CsvProvider传递到Deedle.Frame.
我几乎是F#的新手,我需要将一些CSV文件从文化"it-IT"转换为"en-US",这样我才能使用这些数据.
我找到了Deedle,我想学习如何使用它,但是我无法直接转换Deedle中的CSV文件中的数据(至少是用F#交互式打印的).
我注意到CsvProvider进行了转换,但经过几天的尝试后,我无法传递数据.
我有一个像这样的json文档:
{"index":1,"addressOne":"1506 WAKE FOREST RD","addressTwo":"RALEIGH NC 27604-1331","addressThree":"","assessValue":"$ 34,848","id":" c0e931de-68b8-452e-8365-66d3a4a93483","_"":"pmVVALZMZAEBAAAAAAAAAA ==","_ ts":1423934277,"_ self":"dbs/pmVVAA ==/colls/pmVVALZMZAE =/docs/pmVVALZMZAEBAAAAAAAAAA == /" ,"_标签":"\"0000c100-0000-0000-0000-54df83450000 \"","_附件":"附件/"}
然后我通过类型提供程序加载它,如下所示:
type HouseValuation = JsonProvider<"../data/HouseValuationSample.json">
Run Code Online (Sandbox Code Playgroud)
当我尝试将HouseValuation用作参数的一部分时,它将被强制转换为Object:

我究竟做错了什么?
提前致谢
我试图使用JSON类型提供程序通过API访问StackOverflow/StackExchange数据.它很有用,但有一点需要注意.API有一个节流阀,由一个字段"退避"发出信号,该字段包含您应该退出的秒数,直到您的下一个请求为止.因此,我不能只将JSON TP指向url,因为默认情况下不存在退避字段.这是响应通常看起来的样子:
{
"items": [
{
"has_synonyms": true,
"user_id": 1144035,
"is_moderator_only": false,
"is_required": false,
"count": 7054,
"name": "sql"
},
{
"has_synonyms": true,
"user_id": 1144035,
"is_moderator_only": false,
"is_required": false,
"count": 16,
"name": "algorithm"
}
],
"has_more": true,
"quota_max": 10000,
"quota_remaining": 9693
}
Run Code Online (Sandbox Code Playgroud)
我假设我需要做的是提供一个样本,其中包含一个没有退避的示例(如上所述),以及一个沿着这样的行:
"has_more": true,
"quota_max": 10000,
"quota_remaining": 9693,
"backoff": 10
}
Run Code Online (Sandbox Code Playgroud)
...所以我得到了退避选项.但是,我不确定如何构建/准备样本.非常感谢帮助!
我是F#的初学者,我正在尝试使用CsvProvider并重现这里给出的例子
http://fsharp.github.io/FSharp.Data/library/CsvProvider.html
所以在F#互动中,我打字
>type Stocks = CsvProvider<"MSFT.csv">;;
type Stocks = CsvProvider<...>
> let msft = CsvProvider<"MSFT.csv">.GetSample();;
val msft : CsvProvider<...>
> msft;;
val it : CsvProvider<...> =
FSharp.Data.Runtime.CsvFile`1[System.Tuple`1[System.String]]
{Headers = Some [|"MSFT.csv"|];
NumberOfColumns = 1;
Quote = '"';
Rows = seq [];
Separators = ",";}
> let firstRow = msft.Rows |> Seq.head;;
System.ArgumentException: The input sequence was empty.
Parameter name: source
> at Microsoft.FSharp.Collections.SeqModule.Head[T](IEnumerable`1 source)
at <StartupCode$FSI_0044>.$FSI_0044.main@()
Stopped due to error
Run Code Online (Sandbox Code Playgroud)
我的理解是CsvProvider基于CSV文件创建一个类型,该文件使得以后能够以相同的格式读取该文件或不同的文件/流.我认为我没有目录问题,因为如果文件位于错误的目录中,该函数将返回错误.当创建msft时,F#表示NumberOfColumns = 1,但这显然是错误的.
这也不起作用
> let msft = Stocks.Parse("MSFT.csv");; …Run Code Online (Sandbox Code Playgroud) 我正在使用FSharp.Data SqlDataProvider(类型提供程序)来访问我的数据.尽管这是将数据转换为F#类型的非常好的方法,但显然需要在我想编译代码的每个开发环境中都有一个具有正确模式的数据库.
是否有任何技巧可以在编译期间不要求使用正确的模式安装数据库?像静态模式文件或条件编译?(通常,应用程序可以在不安装数据库的情况下执行)
我正在尝试将FSharp.Data示例转换为我正在处理的问题的解决方案,但我只是没有走得太远.
给定返回json的端点类似于:
{
Products:[{
Id:43,
Name:"hi"
},
{
Id:45,
Name:"other prod"
}
]
}
Run Code Online (Sandbox Code Playgroud)
如何加载数据然后只Id从实际的现有数据中获取数据?
我不明白如何"模式匹配"的可能性:
root.Products可能是不存在/空Id可能不存在namespace Printio
open System
open FSharp.Data
open FSharp.Data.JsonExtensions
module PrintioApi =
type ApiProducts = JsonProvider<"https://api.print.io/api/v/1/source/widget/products?recipeId=f255af6f-9614-4fe2-aa8b-1b77b936d9d6&countryCode=US">
let getProductIds url =
async {
let! json = ApiProducts.AsyncLoad url
let ids = match json with
| null -> [||]
| _ ->
match json.Products with
| null -> [||]
| _ -> Array.map (fun (x:ApiProducts.Product)-> x.Id) …Run Code Online (Sandbox Code Playgroud) 我们有一个简单的 F# 控制台应用程序,它通过FSharp.Data Http.Request. 我们正在使用该customizeHttpRequest参数来尝试设置请求超时属性。我们的用法如下:
let response = Http.Request(
serviceEndpoint,
headers = requestHeaders,
body = requestBody,
silentHttpErrors = true,
customizeHttpRequest = (fun request -> request.Timeout <- 1000; request))
Run Code Online (Sandbox Code Playgroud)
我们观察到我们的自定义超时被忽略(即请求在 1 秒后不会超时,如本例所示)。System.Net.HttpWebRequest我们还观察到,在默认超时 100,000ms后,请求不会超时。
这里有问题吗,还是我们没有customizeHttpRequest正确使用参数?
有没有办法按表的列而不是按行进行迭代?API示例在行中有结算日期信息:
Settlement Day,Period,IMBALNGC,Offer Volume Bid Volume,Accepted Offer Vol,Accepted Bid Vol,UAOV,UABV,PAOV,PABV
2014-01-14,1,877.000,52378.500,-53779.500,348.200,-654.374,0.000,0.000,348.200,-654.374
2014-01-14,2,196.000,52598.000,-53559.500,349.601,-310.862,0.000,0.000,316.701,-310.862
2014-01-14,3,-190.000,52575.000,-53283.500,186.183,-2.426,0.000,0.000,162.767,-1.917
2014-01-14,4,-61.000,52576.000,-53454.500,18.000,-24.158,0.000,0.000,18.000,-24.158
Run Code Online (Sandbox Code Playgroud)
但是,如果结算日信息在列中,有没有一种方法可以执行类似于 API 示例的操作,如下所示:
let firstCol = mrktDepth.Columns|> Seq.head
let settlementDate = firstCol.``Settlement Day``
let acceptedBid = firstCol.``Accepted Bid Vol``
let acceptedOffer = firstCol.``Accepted Offer Vol``
Run Code Online (Sandbox Code Playgroud) 我有一个库,我使用FSharp.Data'sJsonProvider从 JSON 文件构造类型。但是,当我在控制台应用程序中引用该项目并尝试访问生成的类型时,它不会编译,而是在控制台应用程序的目录中查找示例文件,产生如下错误
Cannot read sample JSON from 'sample.json': Could not find file 'C:\Some\Where\TheSolution\ConsoleApp\sample.json
Run Code Online (Sandbox Code Playgroud)
我真的必须将示例文件复制到每个引用项目中,还是必须将其添加为 DLL 才能使其正常工作,还是我做错了什么?