F # терпит неудачу с «Ошибка 4 Это ожидание было иметь тип int, но здесь имеет тип int -> int» - PullRequest
1 голос
/ 20 апреля 2011

Вот код, который я пытаюсь заставить работать в последней строке, где он терпит неудачу:

let rec gcd a b =
    if b= 0 then
        a
    else
        gcd b (a % b);;

let n = 8051
let mutable d = 0
let mutable c = 1
let mutable xi = 2
let mutable yi = 2
let f x = (pown x 2) + (c % n);;
while c < 100 do
    while d = 1 do
        xi <- (f xi)
        yi <- (f(f(yi)))
        printfn "%d%d" xi yi        
        d <- gcd(abs (xi - yi) n)

--------------------- работает следующий код; За исключением целочисленного переполнения на N ---------

module Factorization


let rec gcd a b =
    if b= 0 then
        a
    else
        gcd b (a % b);;

let n = 600851475143N
let mutable d, c, xi, yi = 1, 1, 2, 2
let f x = (pown x 2) + (c % n);;

let maxN m =int(ceil(sqrt(float m)))
//if (n > maxN(xi)) && (n >  maxN(yi)) then
while c < 100 do
    d <- 1
    while d = 1 do        
        if (maxN(n) > xi) && (maxN(n) >  yi) then
            xi <- f xi
            yi <- f(f(yi))           
            d <- gcd (abs (xi - yi)) n
            //fail
            if d = n then d<-1
            if d <> 1 then printfn "A prime factor of %d x = %d,  y = %d, d = %d" n xi yi d
        else
            xi <- 2
            yi <- 2
            c  <- c + 1;;

Ответы [ 3 ]

2 голосов
/ 20 апреля 2011

В дополнение к тому, на что указал @Rangoric, внешние скобки также должны идти, иначе карри не сработает:

d <- gcd (abs(xi-yi)) n
2 голосов
/ 20 апреля 2011

Yikes, вот несколько незапрошенных советов (@BrokenGlass сам ответил на вопрос правильно).

Сначала вы можете назначить все эти изменчивые в одной строке:

let mutable d, c, xi, yi = 0, 1, 2, 2

Во-вторых, не беспокойтесь о скобках:

xi <- f xi
yi <- f (f yi)

И, конечно же, попытайтесь избавиться от изменяемых и циклических переменных. Но я оставлю это вам, так как я уверен, что вы знаете, что реализовали gcd с использованием рекурсии.

1 голос
/ 20 апреля 2011

Попробуйте:

d <- gcd (abs(xi-yi)) n

Это указывает на то, что abs является int-> int, а не int как таковым.Заключение в скобки приводит к выполнению abs до того, как gcd его увидит.Это заставляет gcd видеть результат abs вместо самого abs.

...