Явное указание типов параметров в F#

Я пишу функцию 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.

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

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


person Kirk Broadhurst    schedule 28.09.2011    source источник
comment
Я думаю, что здесь ошибка отступа - строка printfn должна быть лишена отступа, чтобы она находилась после цикла while   -  person John Palmer    schedule 28.09.2011
comment
@jpalmer Нет, я хочу, чтобы он печатал значение каждого делителя. например для 8 он должен напечатать 2, 2, 2.   -  person Kirk Broadhurst    schedule 28.09.2011
comment
Похоже на случай концепции классов Type в Haskell :)   -  person Ankur    schedule 28.09.2011


Ответы (2)


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

person kvb    schedule 28.09.2011
comment
Это очень просто — мне также нужно привести простые числа, такие как (int64)p. - person Kirk Broadhurst; 28.09.2011
comment
@Kirk - да, я предполагал, что ваши простые числа уже были значениями int64. - person kvb; 28.09.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

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

person John Palmer    schedule 28.09.2011
comment
Онлайн-документы MSDN#s (с некоторыми примерами, особенно с использованием литерала 1): Встроенные функции (F#). - person Richard; 04.12.2014