假设我已经定义了一些类型缩写
type Individual = Double array
并且我在整个 F# 项目中都在使用它:
let generateIndividual = [|1.0; 2.0|]
智能感知告诉我
generateIndividual
有一个关联的返回类型 float[]
.因为我希望它出现 Individual
作为返回类型,我将其签名更改为let generateIndividual : Individual = [|1.0; 2.0|]
使用内部代码时,Intellisense 显示的内容并不重要。但是当做用于外部世界的 API 时,让我的函数显示别名而不是原始类型似乎更漂亮。
除了上面显示的方法之外,还有什么办法可以避免输入它们吗?根据斯文森的建议,我查看了签名文件,虽然起初它们似乎正是我想要的,但它们似乎无法做到。
最佳答案
键入别名,例如您的 Individual
如果您使用显式注释来标记具有类型的值(或函数参数和结果),则仅在 F# 中可见。在编译时,别名被替换为实际类型(例如 Double array
)。这意味着 F# 将两者视为相同的类型,并且无法保证您只会看到别名。您可以在任何地方添加类型注释,但如果其他人使用该类型,他们也必须这样做。
如果要确保,则需要使用包装器。具有单个案例的可区分联合是很好的方法,因为它们易于构造和分解:
type Individual = Individual of Double array
// Creating single-case union
let generateIndividual = Individual [|1.0; 2.0|]
// Decomposing single-case union
let sumIndividual (Individual data) = Array.sum data
关于.net - 除了必须总是自己编写之外,如何确保我们的函数在 F# 中使用缩写类型而不是基元?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7382680/