Можно ли объявить тип в области видимости функции в F #? - PullRequest
8 голосов
/ 25 августа 2011

Допустим, у меня есть функция, которая делает что-то довольно сложное, и она реализована с помощью подфункций.Чтобы упростить задачу, вместо кортежей я хотел бы использовать некоторые промежуточные структуры, которые являются частными для реализации этой функции.

Я не хочу, чтобы декларация этих структур просочилась наружу.Итак, я хочу что-то вроде этого:

let someComplexFun p =
    type SomeRecord      = {i:int; x:int; y:int;}
    type SomeOtherRecord = {...}

    let innerFunctionA (x:SomeRecord) = ...
    let innerFunctionB (x:SomeOtherRecord) = ...

    ...

Я попробовал это, но, конечно, компилятор не позволяет мне сделать это.Я посмотрел документацию и нигде не вижу, что типы должны быть объявлены на уровне модуля.

Например, в LISP кажется, что все это совершенно законно, например:

(defun foo (when)
    (declare (type (member :now :later) when)) ; Type declaration is illustrative and in this case optional.
    (ecase when
        (:now (something))
        (:later (something-else))))

Итак, я что-то упустил?Возможно ли это, если F # вообще?

Ответы [ 3 ]

7 голосов
/ 25 августа 2011

Чтобы убедиться, что это не разрешено согласно спецификации, взгляните на грамматику выражений F # в спецификации: Раздел 6: Выражения .В нем перечислены различные конструкции, которые можно использовать вместо expr, и ни одна из них не является объявлением типа type-defn (описано в Раздел 8: Объявления типа ).

(упрощенно) синтаксис для объявлений функций let ident args = expr, поэтому тело должно быть выражением (и вы не можете объявлять типы внутри выражений).

2 голосов
/ 25 августа 2011

Типы могут быть объявлены только в области модуля или пространства имен в F #.

(Вы можете использовать модификаторы доступа, такие как internal или файлы сигнатур, чтобы скрыть типы от других компонентов.)

0 голосов
/ 25 августа 2011

Что сказал Брайан.

вот ссылка на дополнительную информацию http://www.ctocorner.com/fsharp/book/ch17.aspx

...