管道运营商拒绝工作

鲁斯塔姆

我不明白为什么

let data = 
    JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, string>>>(
         File.ReadAllText <| Path.Combine(myPath, "ejv.json"))

还可以,而这

let data = 
    JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, string>>> 
    <| File.ReadAllText
    <| Path.Combine(myPath, "ejv.json")

给我两个错误,首先是:

第一个错误

第二个是:

第二次错误

我做错什么了?

UPDATE @PatrykĆwiek建议进行良好的编辑,似乎可以修复类型错误:

let data = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, string>>> 
       << File.ReadAllText 
       <| Path.Combine(myPath, "ejv.json")

但是,这又产生了另一条令人费解的消息:意外的类型参数。这是屏幕截图:

意外的类型参数。

我可以轻松地删除它,<Dictionary<string, Dictionary<string, string>>>但是在这种情况下,我的数据是object类型,而不是Dictionary我还能以某种方式保存使用流水线的类型信息吗?

感谢@ Patryk,Ćwiek的解决方案如下:

let d<'a>(s:string) = JsonConvert.DeserializeObject<'a>(s)
let data = 
    Path.Combine(myPath, "ejv.json") 
    |> File.ReadAllText 
    |> d<Dictionary<string, Dictionary<string, string>>> with 

我不知道为什么,但是没有这个别名d是行不通的。

帕特里克·维克(PatrykĆwiek)

据我所知,评估从左到右进行,因此您的第二个表达式等效于:

let data = 
    (JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, string>>> <| File.ReadAllText)
    <| Path.Combine(myPath, "ejv.json")

注意操作流程。这意味着您DeserializeObject要先传递一个函数,可能不是您要执行的操作。

执行此操作时:

let data = 
    JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, string>>> 
    <| (File.ReadAllText <| Path.Combine(myPath, "ejv.json"))

它会工作。这相当于您的第一个选择。

另一种解决方案是反转管道以使数据流更自然:

let data = Path.Combine(myPath, "ejv.json") 
           |> File.ReadAllText 
           |> JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, string>>>

编辑

我忽略了一种不常用的选项。您也可以使用函数组合运算符<<使其工作:

let data = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, string>>> 
           << File.ReadAllText 
           <| Path.Combine(myPath, "ejv.json")

它本质上是合并DeserializeObject : string -> 'aReadAllText : string -> string合并到(在上面的示例中未命名)函数f : string -> 'a,其中f(s) = DeserializeObject(ReadAllText(s))然后将Path.Combine通过管道的结果输入f

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章