gpt4 book ai didi

f# - 有通用的 MultiplyByInt 吗?

转载 作者:行者123 更新时间:2023-12-02 06:40:08 25 4
gpt4 key购买 nike

有一个通用函数 LanguagePrimitives.DivideByInt 可以除以 int 而不会丢失通用行为,我们可以这样使用它:

let inline Divideby2 n = LanguagePrimitives.DivideByInt n 2

val inline Divideby2 :
^a -> ^a when ^a : (static member DivideByInt : ^a * int -> ^a)

但是没有名为 MultiplyByInt 的函数来执行 int 的一般乘法。有什么可以执行通用乘法吗?像这样:

let inline MultiplyBy2 n = SomeGenericFunctionsModule.MultiplybyInt n 2;

P.S. 我们总是可以使用一些非标准的方法,例如:

let inline MultiplyByInt n m = seq { for i in 1..m -> n} |> Seq.sum

但我很感兴趣是否有可能以正确的方式进行。

最佳答案

恐怕没有内置功能,但我可以提出两个替代解决方案:

type MulExtension = MulExtension of int with
static member (=>) (x:float , MulExtension y) = x * (float y)
static member (=>) (x:decimal, MulExtension y) = x * (decimal y)
static member (=>) (x:int64 , MulExtension y) = x * (int64 y)
// More overloads

let inline MultiplyByInt x y = x => MulExtension y

但是您必须指定每种类型。我宁愿使用这个功能:

let inline MultiplyByInt  x y = 
let fromInt (n:int) : ^a when ^a : (static member (*) : ^a * ^a -> ^a) =
System.Convert.ChangeType(n, typeof<'a>) :?> 'a
x * (fromInt y)

我看不出这两种方法在性能上有什么区别。

关于f# - 有通用的 MultiplyByInt 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9527411/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com