2016-07-19 5 views
4

По местным типам я имею в виду тип, который доступен только в пределах конкретной функцииМожно ли иметь локальные типы в F #

Например позволяет сказать, что я хочу взять некоторые данные, форматировать, и сериализовать его JSON ,

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

Похоже, что этот тип больше не нужен, это должно работать. Однако я получаю ошибки компиляции, когда пишу это.

Есть ли способ получить аналогичную функциональность в F #?

+0

Выражения объектов - https://msdn.microsoft.com/en-us/visualfsharpdocs/conceptual/object-expressions-%5Bfsharp%5D аналогичны –

+1

@JohnPalmer Не являются ли эти анонимные? разве вы не теряете способность к некоторым полиморфным материалам при использовании этого? – t3dodson

+2

Вы можете использовать модификатор доступа «private», чтобы доступ к типу можно было получить только из прилагаемого модуля. – bytebuster

ответ

4

F # не поддерживает декларации типов в пределах области действия.

Ближайший вы можете получить это, чтобы определить модуль и сохранить тип локальной для модуля:

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

Если поместить код сериализации в отдельный модуль, то вы можете сохранить ваш тип частного к модуль с использованием модификатора private, который также сохранит его локально для функций сериализации - не совсем для одной функции, но достаточно близко.

Кроме того, мне также нужен атрибут DataContract, чтобы он действительно работал.

Смежные вопросы