是否可以在F#中的函数范围声明一个类型?

Phi*_* P. 8 f# functional-programming

假设我有一个功能,它做了一些相当复杂的功能,它是在子功能的帮助下实现的.为了使事情更容易,而不是元组,我想使用一些私有的中间结构来实现这个功能.

我不希望这些结构的声明泄漏到外面.所以我想要这样的东西:

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

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

    ...
Run Code Online (Sandbox Code Playgroud)

我尝试过但当然编译器不允许我这样做.我查看了文档,我无法在任何地方看到类型必须在模块级别声明.

例如,在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))))
Run Code Online (Sandbox Code Playgroud)

那么,我错过了什么吗?如果F#完全可以吗?

Tom*_*cek 7

要根据规范验证不允许这样做,请查看规范中F#表达式的语法:第6节:表达式.它列出了可以代替的各种构造,expr它们都不是类型声明type-defn(在第8节:类型声明中描述).

函数声明的(简化)语法是let ident args = expr,所以正文必须是一个表达式(并且你不能在表达式中声明类型).