这里导致语法错误的原因是什么?

时间:2015-02-24 05:26:10

标签: ocaml

我正在尝试实现此算法,但我在第12行遇到语法错误,但我无法确定导致它的原因。我是ocaml的新手,非常感谢任何帮助。

“通过Eratosthenes的方法找到小于或等于给定整数n的所有素数:

创建从2到n的连续整数列表:(2,3,4,...,n)。 最初,让p等于2,即第一个素数。 从p开始,通过以p的增量计数n来枚举其倍数,并在列表中标记它们(这些将是2p,3p,4p,...;不应该标记p本身)。 在列表中找到未标记的第一个大于p的数字。如果没有这样的号码,请停止。否则,让p现在等于这个新数字(这是下一个素数),并从步骤3开始重复。“

let prime(n) =
    let arr = Array.create n false in
    let set_marks (arr , n , prime ) = Array.set arr (n*prime) true  in 
        for i = 2 to n do 
            set_marks(arr,i,2) done   

    let findNextPrimeNumberThatIsNotMarked (arr, prime , index ) =
        let nextPrime = Array.get arr index in 
        let findNextPrimeNumberThatIsNotMarkedHelper (arr, prime, index)  =
            if nextPrime > prime then nextPrime  
            else prime in       

    ;;  

2 个答案:

答案 0 :(得分:2)

加入Jeffrey的回答,

正如我已经在" What exactly is the syntax error here?",

您现在绝对需要做的是安装和使用适当的OCaml缩进工具和自动缩进行。意外的自动缩进结果通常表示遗忘;等语法错误。如果没有这样的工具,即使有才华的OCaml程序员在没有语法错误的情况下编写OCaml代码也很难。

OCaml有很多自动压头可用:

答案 1 :(得分:1)

OCaml有一个表达式let a = b in c。您的代码以in结尾,但c位于何处?看起来你最后应该删除in

仔细观察,我发现有更多问题,抱歉。

OCaml中的一个函数大概如下:

let f x =
    let a = b in
    let c = d in
    val

prime的定义与此完全相同,只是它以for循环结束,即使用关键字done

其余代码形成第二个独立的函数定义。它的形式如下:

let f x =
    let a = b in
    let g x = expr in

语法问题是你在in之后错过了一个表达式。

但是,您使用缩进表示您并未尝试定义两个不同的功能。如果是这样,您需要稍微修改一下代码。

对于命令式样式编程可能有用的一件事是你可以编写expr1; expr2来一个接一个地计算两个表达式。