我在这里参加聚会显然迟到了,但知道你为什么要创建一个divBy2
函数会很有趣。这里有两个问题,解决其中一个可能就足够了,具体取决于您的需要。
第一个问题是没有LanguagePrimitives.GenericTwo
. 这很容易解决,但如果您想为除 2 以外的除数定义特定除法函数,该解决方案的用途有限:
let inline divBy2 n =
n / (LanguagePrimitives.GenericOne + LanguagePrimitives.GenericOne)
为了减少输入,您可以分配LanguagePrimitives.GenericOne
给一个变量,随着除数的增加,它变得更加有用:
let inline divBy4 n =
let one = LanguagePrimitives.GenericOne
let two = one + one
n / (two + two)
如果您想创建通用功能,此解决方案也无济于事。“自定义”方式是
let inline divBy divisor dividend = dividend / divisor
我们可以将它与部分函数应用程序一起使用,以将字节列表减半,例如,如下所示:
let halfBytes = [ 1uy .. 10uy ] |> List.map (divBy 2uy)
但我们可以做得更好。这个问题适用于所有非交换运算符,包括减法。为了绕过它,我们可以定义
let flip f a b = f b a
例如,这允许
let scaledInThousands = [ 0m .. 500m .. 3000m ] |> List.map (flip (/) 1000m)
let decrementedIntegers = [ 1 .. 10 ] |> List.map (flip (-) 1)
如果你愿意,你仍然可以定义 divBy 函数:
let inline divBy n = flip (/) n
let halfInts = [ 1 .. 10 ] |> List.map (divBy 2)
let halfLongs = [ 1L .. 10L ] |> List.map (divBy 2L)
let fifthLongs = [ 1L .. 10L ] |> List.map (divBy 5L)
let oneThroughTenOverPi = [ 1.0 .. 10.0 ] |> List.map (divBy System.Math.PI)