f# - 使用强制 F# 创建具有自定义类型的 "plus"函数

标签 f# coercion

我目前有一种特殊类型,可以是 int 也可以是 float。我想创建一个函数,允许我将其中两个添加在一起。 (如有必要,将 int 强制转换为 float)我希望该函数具有我的特殊类型的返回类型。

这是我到目前为止所拥有的:

type number = A of int | B of float;;

let plus x1:number x2:number = (number x1) + (number x2);;

无法编译。但它看起来与我使用 ML 编程语言时编写的内容类似。

我的 plus 函数在 F# 中应该是什么样子?

最佳答案

type number = A of int | B of float;;

let plus x1:number x2:number = (number x1) + (number x2);;

您遇到的问题是双重的:

  1. 您不能使用具有单个值(在本例中为 A 和 B)的可区分联合案例,就好像您拥有该值一样。将每种情况视为一个类,其中有一个值(无论如何,这就是它在字节码中的表示方式)。在尝试使用该值之前,您需要从类中取出该值。

  2. F# 不允许隐式转换。这意味着一旦您从案例中获取值,您将需要将它们转换为通用类型。在这种情况下,您需要将 A 值转换为 float 或将 B 值转换为 int .

正如 @JohnPalmer 在他的回答中指出的那样,解决这两个问题的最明确的方法是使用模式匹配。

关于f# - 使用强制 F# 创建具有自定义类型的 "plus"函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19580969/

相关文章:

python - 如何告诉Python,当存在冲突时,我们总是希望将 Foo 类型的对象解释为 Bar 类型的对象?

f# - 将合并函数从 Haskell 转换为 F#

.net - 如果其中一个作业出现异常,Async.Parallel 是否会取消所有作业?

c# - 如何在 F# 或 C# 中将像素绘制到位图上而不是抗锯齿点上?

r - R 将 "TRUE"字符串强制为 TRUE 逻辑是怎么回事?

javascript - 调用 valueOf 时的操作顺序

silverlight - Silverlight 如何确定程序集为 "Silverlight"?

.net - 扩展方法设计指南 : should a like method name be the same for the sub and super class?

Coq:绕过统一继承条件

perl - 如何确定对象或引用是否具有有效的字符串强制转换?