假设我有一个功能,它可以做一些相当复杂的功能,它是在子功能的帮助下实现的。为了使事情更容易,而不是元组,我想使用一些私有的中间结构来实现这个功能。
我不希望这些结构的声明泄漏到外面。所以我想要这样的东西:
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#完全可以吗?
答案 0 :(得分:7)
要根据规范验证是否允许这样做,请查看规范中的F#表达式的语法:Section 6: Expressions。它列出了可用于代替expr
的各种构造,但它们都不是类型声明type-defn
(在Section 8: Type Declarations中描述)。
函数声明的(简化)语法是let ident args = expr
,因此正文必须是一个表达式(并且你不能在表达式中声明类型)。
答案 1 :(得分:1)
只能在F#中的模块或命名空间范围声明类型。
(您可以使用internal
等访问修饰符或签名文件来隐藏其他组件的类型。)
答案 2 :(得分:0)
Brian说的话。
的链接