如何确保我们的函数在F#中使用缩写类型的原语,而不是总是自己编写它?

dev*_*ium 5 .net f# functional-programming

假设我已经定义了一些类型缩写

type Individual = Double array
Run Code Online (Sandbox Code Playgroud)

并且我在整个F#项目中使用它:

let generateIndividual = [|1.0; 2.0|]
Run Code Online (Sandbox Code Playgroud)

IntelliSense告诉我generateIndividual有一个相关的返回类型float[].因为我希望它显示Individual为返回类型,我将其签名更改为

let generateIndividual : Individual = [|1.0; 2.0|]
Run Code Online (Sandbox Code Playgroud)

使用内部代码时,Intellisense显示的内容并不重要.但是当做用于外部世界的API时,让我的函数显示别名而不是基本类型似乎更漂亮.

除了通过上面显示的方法之外,是否有可能以任何方式避免键入它们?根据Swensen的建议,我看了一下Signature文件,虽然起初它们似乎正是我所寻找的,但它们似乎无法做到.

Tom*_*cek 5

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
Run Code Online (Sandbox Code Playgroud)

  • 吞噬极乐世界:在DU中包装一个值类型如float或int之前我也会三思而后行,但由于数组从一开始就已经是引用类型,所以你可能不会失去那么多. (2认同)