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

时间:2011-08-25 12:56:28

标签: f# functional-programming

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

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

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 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:1)

只能在F#中的模块或命名空间范围声明类型。

(您可以使用internal等访问修饰符或签名文件来隐藏其他组件的类型。)

答案 2 :(得分:0)

Brian说的话。

这是指向更多信息http://www.ctocorner.com/fsharp/book/ch17.aspx

的链接