首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >FS0001应该是"int32",而不是“int32”

FS0001应该是"int32",而不是“int32”
EN

Stack Overflow用户
提问于 2020-07-19 15:43:36
回答 2查看 68关注 0票数 0

首先,我是函数式编程和F#的完全初学者。我开始学习一些基本的概念,并试图通过编写一个Mandelbrot设置程序来开始练习我的理解。函数iterate应该接受一个元组,对它进行迭代,如果退出条件infinity是med,它应该返回它所使用的迭代量i。否则,它会用修改过的元组来调用自己。我收到以下错误:FS0001 Should be "int32", is "unit" instead第2行

编辑: mandelbrot接受一个元组并返回一个元组;无穷大接受一个元组并返回一个整数

代码语言:javascript
代码运行次数:0
运行
复制
let rec iterate (a, b) :int32 = 
    for i:int32 in 0..100 do 
        (a, b)
        |> mandelbrot
        |> match infinity with
            | a when a > 16 -> i
            | a when a <= 16 -> iterate (a, b)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-19 19:13:02

很难猜出你想要实现什么。但是,只要做一些调整就可以编译。for do需要一个返回unit的函数,例如一个语句。

如果你想要迭代上百次,你可以使用一个变量i,你在迭代中传递,每次调用时增加它,然后用0(例如iterate (2,3) 0 )初始化它。

代码语言:javascript
代码运行次数:0
运行
复制
let mandelbrot (a,b) = (a,b)

let infinity (a,b) = a


let rec iterate (a, b) i :int = 
        (a, b)
        |> mandelbrot
        |> infinity 
        |> (fun a-> if i=100 then a else
                    match a with
                      | a when a > 16 ->  i
                      | _ ->  iterate (a,b) (i+1))
票数 2
EN

Stack Overflow用户

发布于 2020-07-19 22:05:07

在我试图不必要地解释这个函数之前,这里的代码是如何用C编写的:

整数迭代( int a,int b) { int i,ca = a,cb = b,aa,bb;

代码语言:javascript
代码运行次数:0
运行
复制
for (i = 0; i <= 100; i++) {
    aa = a * a - b * b;     //mandelbrot algorithm
    bb = 2 * a * b;
    a = aa + ca;
    b = bb + cb;

    //checks if the the values deviate to infinity
    if ((a + b) > 16) { 
        return i;
    }
}

}

我考虑过使用递归,但由于我不习惯函数范式,所以出于效率的考虑,我试图避免它,并且基本上尝试创建一个中断条件。结果,F#将尾递归编译为while循环,所以所有这些都是不必要的,而且是愚蠢的。https://gist.github.com/mrange/3a275cc643c9753925f1c8a68b0bd7a0

仍然希望它能帮助到一些人,并感谢所有试图从我写的代码中弄明白的人。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62982404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档