【发布时间】:2012-07-18 16:59:57
【问题描述】:
假设我正在解决一个特定问题并想出一个函数
let function parameter1 ... =
a lot of adding, multiplying & so on with a lot of
literals all over the place
现在,如果我的参数是 int 类型,这个函数就可以正常工作了。但是在某个地方,我需要将它增加到 11,我需要额外推动 int64 甚至 BigInteger。那我该怎么办? 我复制并粘贴函数,更改名称,然后寻找所有使编译器认为函数应该在 int 上运行的文字外观。这很糟糕。
有没有办法做到这一点:
let greatFunction param1 param2 = (param1+1)/(param2*2)
param1 和 param2 可以是整数类型的任意组合?
编辑:
通过下面的 kvb 扩展了一个很棒的技巧,我想出了以下内容
module NumericLiteralG
let inline FromZero() = LanguagePrimitives.GenericZero
let inline FromOne() = LanguagePrimitives.GenericOne
let inline FromInt32 n =
let rec loop nIn nOut =
if nIn>0 then loop (nIn - 1) (nOut + LanguagePrimitives.GenericOne)
else nOut
loop n LanguagePrimitives.GenericZero
所以使用时会变得不那么难看
let inline halfSquare num =
let res = num / 2G
res * res
let solve1 = halfSquare 5I
let solve2 = halfSquare 5.0
let solve3 = halfSquare 5uy
现在的问题是我应该使用这个吗?如果没有,为什么不呢?
【问题讨论】:
-
我认为一般来说你需要一个
Numeric类/接口,这在.net 中不存在(还没有?)。但也许一些特殊的 F# 东西可以帮助你。看看this question。 -
你为什么要问你是否应该使用这个?使用
GenericXXX的内联函数是在 F# 中执行此操作的明确方法。 -
你好丹尼尔。我是 F# 的新手,我真的在尝试,这意味着我努力以实用的方式来做这件事,即使我脑海中尖叫的解决方案都是循环和副作用以及 goto 和诸如此类的东西。现在,来自数字电子/微控制器背景的我非常不知道上面的工作原理。我曾经知道我的代码中每条指令的时间。我曾经手动优化我的编译器输出。所以这是一个诚实的问题,针对比我更了解这个主题的人。 FWIW 我可能正在做最愚蠢的事情而没有意识到这一点。
-
从那个背景来看,我会说这与 C++ 模板相当。注意
inline无处不在。 -
这就是我问的一个原因:stackoverflow.com/questions/2840714/… 这家伙显然抄袭了我的辛勤工作并在 2 年前在这里发布。我的 Google Fu 很弱。