Явное указание типов параметров в F # - PullRequest
3 голосов
/ 28 сентября 2011

Я пишу функцию F #, которая делит число на простые множители.

let factors primes i =
    let mutable j = i
    for p in primes do 
        while (j>1) && (j%p=0) do 
            j <- j/p
            printfn "prime: %i" p

Работает для int значений i, но не int64 значений.Параметр primes представляет собой набор значений int.

Я понимаю, почему это так - вывод типа case предполагает, что функция принимает только int параметров - но я хочу явно указать тип параметра какint64.

Можно ли написать эту функцию, чтобы она работала как для int, так и для int64?

Ответы [ 2 ]

8 голосов
/ 28 сентября 2011

Вам придется сделать что-то вроде

let inline factors (primes :^a list) (i:^a) =
    let zero:^a = LanguagePrimitives.GenericZero
    let one:^a = LanguagePrimitives.GenericOne
    let mutable j = i
    for p in primes do 
        while (j>one) && (j%p=zero) do 
            j <- j/p
            printfn "prime: %i" p

У меня нет компилятора, поэтому мой синтаксис может быть немного не таким

5 голосов
/ 28 сентября 2011

Если вы хотите работать только со значениями int64, просто замените 1 и 0 на 1L и 0L соответственно.Ответ jpalmer охватывает общий случай.

...