Вопрос по – заставить функцию работать со всеми числовыми типами (int, float, long)

3

эта простая функция:

let sum a b = a + b

буду работатьonly for int types

как сделать так, чтобы оно также работало на плавание и долго?

Убедитесь, что вы понимаете, почему эта функция работает только для одного типа, прежде чем пытаться написать какой-либо общий числовой код. Jon Harrop
Если вас интересует более подробная информация, я написал математическую серию статей на F #, в которой есть статья о написании общего числового кода на F # (она охватываетinline, но также несколько более продвинутых опций):tomasp.net/blog/fsharp-generic-numeric.aspx Tomas Petricek

Ваш Ответ

2   ответа
8

использованиев соответствии:

let inline sum a b = a + b

UPDATE:

Если вы заинтересованы в написании своих собственных полиморфных числовых функций, вы должны использовать обав соответствии а такжеLanguagePrimitives модуль.

Вот полиморфная функция косинуса из потокаПреобразование функции Полиморфного косинуса Хаскелла в 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
@ChuckNorris: Вы думаете неправильно. Оставьте в стороне ваше предвзятое представление о том, что означает встроенный, и прочитайте о том, что это значитfor F#.
@ChuckNorris: Вы хотите написать универсальные числовые функции? Это будет выглядеть очень многословно в F #. И вам нужно найти лучший пример, потому что(+) уже является общим.
Может иметь другую цель, но она выполняет то, что вы ищете. @pad прав - это то, как вы делаете то, что хотите.
Я думаю, что inline имеет другую цель Omu
@pad, да, я думаю, что я ищу универсальный, в основном, как еще вы могли бы сделать это, без inline? Omu
3

которую вы даете, работает только для типов int из-за вывода типов; механизм вывода типов автоматически выведет int, потому что он видит сложение. Если вы хотите сделать одну и ту же функцию для float и long, вы должны либо сделать inline, как сказал Pad, либо сделать это:

let sumFloat (a:float) b = a + b

let sumLong (a:int64) b = a + b

Ноinline является правильным механизмом для получения универсального «любого типа, который поддерживает сложение» поведение, которое вы ищете.

Похожие вопросы