Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Types 在F中可以有本地类型吗#_Types_Scope_F#_Functional Programming - Fatal编程技术网

Types 在F中可以有本地类型吗#

Types 在F中可以有本地类型吗#,types,scope,f#,functional-programming,Types,Scope,F#,Functional Programming,我所说的局部类型是指只能在特定函数中访问的类型 例如,假设我想要获取一些数据,格式化它,并将其序列化为json let parse data = // hypothetical scenario type Record = { root : string[] } let record = { root = data } JsonConvert.SerializeObject record 似乎因为其他地方不需要该类型,所以应该可以使用。然而,当我写这篇文章时,我会遇到编

我所说的局部类型是指只能在特定函数中访问的类型

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

let parse data = // hypothetical scenario
    type Record = { root : string[] }
    let record = { root = data }
    JsonConvert.SerializeObject record
似乎因为其他地方不需要该类型,所以应该可以使用。然而,当我写这篇文章时,我会遇到编译错误

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

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

最接近这一点的方法是定义一个模块,并将类型保持为模块的本地类型:

module MyLogic = 
    type private LocalType = {root: string []}
    let serialize data =
        let record = {root = data}
        JsonConvert.SerializeObject record
如果将序列化代码放入一个单独的模块中,则可以使用
private
修饰符将类型保持为模块的私有,这也将使其保持在序列化功能的本地-不完全是单个函数,但相当接近


除此之外,我认为您还需要记录上的
DataContract
属性才能使其实际工作similar@JohnPalmer这些不是匿名的吗?当你使用这个时,你会不会失去一些多态性的功能?你可以使用
private
access修饰符,这样你的类型只能从封闭的模块中访问。