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

时间:2016-07-19 02:09:05

标签: types scope f# functional-programming

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

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

let parse data = // hypothetical scenario
    type Record = { root : string[] }
    let record = { root = data }
    JsonConvert.SerializeObject record

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

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

1 个答案:

答案 0 :(得分:5)

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

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

module MyLogic = 
    type private LocalType = {root: string []}
    let serialize data =
        let record = {root = data}
        JsonConvert.SerializeObject record

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

除此之外,我认为您还需要记录上的DataContract属性才能使其真正有效。