是否可以在F#中使用本地类型

t3d*_*son 4 f# types scope functional-programming

本地类型是指只能在特定函数中访问的类型

例如,假设我想获取一些数据,格式化它,并将其序列化为json.

let parse data = // hypothetical scenario
    type Record = { root : string[] }
    let record = { root = data }
    JsonConvert.SerializeObject record
Run Code Online (Sandbox Code Playgroud)

似乎因为在其他任何地方都不需要这种类型.但是当我写这个时,我得到了编译错误.

有没有办法在F#中获得类似的功能?

Tom*_*cek 5

F#不支持函数范围内的类型声明.

你可以得到的最接近的是定义一个模块并保持模块的本地类型:

module MyLogic = 
    type private LocalType = {root: string []}
    let serialize data =
        let record = {root = data}
        JsonConvert.SerializeObject record
Run Code Online (Sandbox Code Playgroud)

如果您将序列化代码放入一个单独的模块中,那么您可以使用private修饰符将类型保持为模块专用,这也将使其保持在序列化功能的本地 - 不是单个函数,而是相当接近.

除此之外,我认为您还需要DataContract记录中的属性才能使其真正起作用.