F#失败并显示“错误4此表达式应该具有int类型,但此处的类型为int - > int”

时间:2011-04-19 20:04:24

标签: f# functional-programming

以下是我试图在最后一行工作的代码是失败的地方:

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 个答案:

答案 0 :(得分:2)

除了@Rangoric所指出的,外部括号必须去,否则currying将无效:

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

答案 1 :(得分:2)

Yikes,这里有一些不请自来的提示(@BrokenGlass正确回答了问题)。

首先,您可以在一行中分配所有这些可变项:

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

其次,在括号上轻松一下:

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

当然,尝试摆脱变量和while循环。但是我会留给你的,因为我确定你知道你看到你使用递归实现了gcd

答案 2 :(得分:1)

尝试:

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

它指出abs是一个int-&gt; int而不是一个int本身。将它包装在括号中会导致在gcd查看之前执行abs。这导致gcd看到abs的结果而不是abs本身。