泛型 – 管道操作符拒绝工作
我无法理解为什么会这样
let data = JsonConvert.DeserializeObject<Dictionary<string,Dictionary<string,string>>>( File.ReadAllText <| Path.Combine(myPath,"ejv.json")) 没关系,而这个 let data = JsonConvert.DeserializeObject<Dictionary<string,string>>> <| File.ReadAllText <| Path.Combine(myPath,"ejv.json") 给我两个错误,首先是: 第二是: 我做错了什么? UPDATE@Patryk?wiek提出了一个很好的编辑,它似乎修复了类型的错误: let data = JsonConvert.DeserializeObject<Dictionary<string,string>>> << File.ReadAllText <| Path.Combine(myPath,"ejv.json") 但它产生了另一个令人费解的消息:意外的类型参数. 我可以很容易地删除它< Dictionary< string,Dictionary< string,string>>>但在这种情况下,我的数据是对象类型,而不是字典.我可以以某种方式保存类型信息使用流水线吗? 解 感谢@Patryk?wiek解决方案如下: let d<'a>(s:string) = JsonConvert.DeserializeObject<'a>(s) let data = Path.Combine(myPath,"ejv.json") |> File.ReadAllText |> d<Dictionary<string,string>>> with 我不知道为什么,但如果没有别名,它就行不通. 解决方法
据我所知,评估从左到右,所以你的第二个表达式相当于:
let data = (JsonConvert.DeserializeObject<Dictionary<string,string>>> <| File.ReadAllText) <| Path.Combine(myPath,"ejv.json") 注意操作如何流动.这意味着你首先将一个函数传递给DeserializeObject,可能不是你想要做的. 当你这样做: let data = JsonConvert.DeserializeObject<Dictionary<string,string>>> <| (File.ReadAllText <| Path.Combine(myPath,"ejv.json")) 它会工作.这相当于你的第一选择. 其他解决方案是反转管道以使数据流更自然: let data = Path.Combine(myPath,"ejv.json") |> File.ReadAllText |> JsonConvert.DeserializeObject<Dictionary<string,string>>> 编辑 我忽略了一个选项,这不常用.您可以使用函数组合运算符<<使它也有效: let data = JsonConvert.DeserializeObject<Dictionary<string,string>>> << File.ReadAllText <| Path.Combine(myPath,"ejv.json") 它基本上结合了DeserializeObject:string – > ‘a和ReadAllText:string – > string into(上例中未命名)函数f:string – > ‘a,其中f(s)= DeserializeObject(ReadAllText(s)).然后它通过管道将Path.Combine的结果输入f. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |