.net - 除了必须总是自己编写之外,如何确保我们的函数在 F# 中使用缩写类型而不是基元?

标签 .net f# functional-programming

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

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/

相关文章:

f# - 从 F# DU 访问特定案例

swift - 在 Swift 中优雅地检查两个结构体实例是否不同

javascript - 为什么这个函数返回真?

javascript - 在 JSON.parse 中使用 BsonDocument.ToJson 的结果失败

f# - F# 3.0 运行时是否可再发行?

c# - Nhibernate 在选择时做更新?

f# - 如何创建扩展方法 (F#)?

java - 如何使用可选项实现这个嵌套流程?

c# - ASMX Web 服务公开类

c# - 使用 phpMyAdmin 更改 MySql 区分大小写?