Я явно опоздал на вечеринку, но было бы интересно узнать, почему вы хотите создать функцию 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)
person
phoog
schedule
18.08.2014
FSharp.Core
- код, который вам нужно изменить, находится примерно в строке 2300 изprim-types.fs
. - person John Palmer   schedule 02.03.2012