F# 使函数可用于所有数字类型(int、float、long)
此简单功能:F# 使函数可用于所有数字类型(int、float、long),f#,F#,此简单功能: let sum a b = a + b 仅对int类型有效 如何使其也适用于浮动和长时间?使用: 更新: 如果您对编写自己的多态数值函数感兴趣,那么应该同时使用和模块 以下是线程中的多态余弦函数: 由于类型推断,您给出的示例函数仅适用于int类型;类型推断机制将自动推断int,因为它看到了加法。如果您想为float和long创建相同的函数,您可以按照Pad所说的内联操作,也可以这样做: let sumFloat (a:float) b = a + b let sumLong
let sum a b = a + b
仅对int类型有效
如何使其也适用于浮动和长时间?使用:
更新: 如果您对编写自己的多态数值函数感兴趣,那么应该同时使用和模块 以下是线程中的多态余弦函数:
由于类型推断,您给出的示例函数仅适用于int类型;类型推断机制将自动推断int,因为它看到了加法。如果您想为float和long创建相同的函数,您可以按照Pad所说的内联操作,也可以这样做:
let sumFloat (a:float) b = a + b
let sumLong (a:int64) b = a + b
但是内联是获得您正在寻找的通用“支持加法的任何类型”行为的正确机制。我认为内联有不同的目的可能有不同的目的,但它实现了您所寻找的@pad是对的——这就是你想做的。@ChuckNorris:你想写一般的数值函数吗?用F#表示会非常冗长。你需要找到一个更好的例子,因为
(+)
已经是泛型的了。@pad是的,我想泛型就是我要找的,基本上,没有内联,你还能怎么做?@ChuckNorris:你想得不对。抛开你对内联意味着什么的先入为主的概念,读一读它对F#意味着什么。如果你对更多细节感兴趣,我写了一篇F#math系列文章,其中有一篇关于用F#编写通用数字代码的文章(包括内联
,还有一些更高级的选项):在尝试编写任何通用数字代码之前,请确保您了解为什么此函数仅适用于一种类型。
let inline cosine n (x: ^a) =
let one: ^a = LanguagePrimitives.GenericOne
Seq.initInfinite(fun i -> LanguagePrimitives.DivideByInt (- x*x) ((2*i+1)*(2*i+2)))
|> Seq.scan (*) one
|> Seq.take n
|> Seq.sum
let sumFloat (a:float) b = a + b
let sumLong (a:int64) b = a + b