在F#中使用inline关键字出现问题。

4

我正在尝试创建一个函数,它可以接受整数和浮点数作为参数。问题在于,尽管使用了关键字inline,但编译器仍然会自动推断出函数中的类型,因为其中包含数字。以下是我的意思:

(* Infers ints for every parameter because of '1' *)
let inline Lerp a b t = (1 - t) * a + t * b
(* Infers floats for every parameter because I added '.0' to '1' *)
let inline Lerp' a b t = (1.0 - t) * a + t * b

我可以创建两个单独的函数,但这有些令人失望。有没有其他方法?

1个回答

8
您需要使用LanguagePrimitives.GenericOne,它可以解析为任何基本数值类型或具有静态成员'One'的任何类型的值“one”。
let inline Lerp a b t =
  (LanguagePrimitives.GenericOne - t) * a + t * b

Lerp 1 2 3 |> printfn "%A"         // 4
Lerp 1.1 2.2 3.3 |> printfn "%A"   // 4.73

我猜在我的情况下它是有效的,但如果我使用了一个不同的数字呢?是否有一种通用数字类型可以使用? - tigerros
1
很遗憾,不行。但是你可以从零和一构建其他通用数字。 - Brian Berns
你必须确保你的算术全部是通用的,而不是使用整数。这样你就可以这样做:let two = GenericOne + GenericOne。为了系统化,你甚至可以使用Peano算术创建其他数字,通过将加法定义为重复继承,然后定义乘法为重复加法等。 - Brian Berns
是的,我明白了:)。抱歉删除了评论。 - tigerros
实际上,我建议的代码似乎不起作用,所以它并不像我想象的那么简单。我会看看能否提出更好的解决方案。 - Brian Berns
只要所有参数都是相同类型,它就能正常工作。在这种情况下,ab将是整数,而t将是浮点数,但这并没有在我的问题中明确说明,这就是为什么我仍然将答案标记为解决方案的原因。最终我只是创建了一个额外的函数,将前两个值转换为浮点数。如果您能找到更好的解决方案,那将不胜感激。 - tigerros

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接