Я явно опаздываю на вечеринку, но было бы интересно узнать, почему вы хотите создать функцию 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)