从` `中读取的泛型函数.json文件



所以,我可以很容易地用Newtonsoft.JsonJSON写一个任意类型:

type X = {
Number: decimal
Sequence: decimal
NumList: decimal list
}
let createItem (n, s, nL) = 
    {Number = n; 
    Sequence = s; 
    NumList = nL}
let items =
    [
        (1M, 1M, [1M; 2M; 3M])
        (2M, 2M, [2M; 4M; 6M])
        (3M, 3M, [3M; 6M; 9M])
    ]
    |> List.map createItem
open Newtonsoft.Json
open System.IO
let writeToJson (path: string) (obj: 'a) : unit =
    let serialized = JsonConvert.SerializeObject(obj)
    File.WriteAllText(path, serialized)
writeToJson "xList.json" items    

我怎么能写一个函数通用足够,我可以读取一个JSON文件?换句话说,我想要这样的内容:

let readFromJson (path: string) (t: 'T) = 
    let convertToQr = File.ReadAllText(path)
    Newtonsoft.Json.JsonConvert.DeserializeObject<t list>(convertToQr)

其中第二个参数是path中对象的Type,但我不知道如何做到这一点。如果我尝试按原样使用这个函数,就会得到编译器错误。

我如何在第二个参数上面声明的东西的类型是在path ?我可以吗?

显式定义的泛型参数在函数名之后、常规参数之前用尖括号括起来:

let readFromJson<'T>(path: string) =
   let convertToQr = File.ReadAllText(path) 
   Newtonsoft.Json.JsonConvert.DeserializeObject<'T list>(convertToQr)

用法:

readFromJson<string> "/some/file.json"

或者,您可以指定函数的返回类型,并让编译器为您推断所有泛型形参和实参:

let readFromJson(path: string) : 't list =
   let convertToQr = File.ReadAllText(path) 
   Newtonsoft.Json.JsonConvert.DeserializeObject(convertToQr)

这里,编译器知道DeserializeObject的泛型参数必须是't list,因为它的结果是从readFromJson返回的,而readFromJson的结果类型被显式声明为't list。类似地,只要注意到函数定义中的泛型类型,编译器就会推断该函数有一个泛型形参。

以类似的方式,当调用函数时,可以让编译器推断所需的类型:
// call inferred to readFromJson<string>, because that's the required return type
let s: string list = readFromJson "/some/file.json"   

相关内容

  • 没有找到相关文章

最新更新