Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Functional programming 什么';代码最后一行的错误是什么?_Functional Programming_Syntax Error_Ocaml - Fatal编程技术网

Functional programming 什么';代码最后一行的错误是什么?

Functional programming 什么';代码最后一行的错误是什么?,functional-programming,syntax-error,ocaml,Functional Programming,Syntax Error,Ocaml,我正在编写一个函数,它将整数列表作为输入,并将素数和复合数分成两个列表: #prime_sep [1; 2; 3; 4; 5; 6];; - : int list * int list = ([5; 3; 2], [6; 4; 1]) 这是我的密码: let rec is_prime n a = match n with (*at the begining put a=3*) | 2 -> true | x when x<=1 -> false | x when x mod

我正在编写一个函数,它将整数列表作为输入,并将素数和复合数分成两个列表:

#prime_sep [1; 2; 3; 4; 5; 6];;
- : int list * int list = ([5; 3; 2], [6; 4; 1])
这是我的密码:

let rec is_prime n a = match n with (*at the begining put a=3*)
| 2 -> true
| x when x<=1 -> false
| x when x mod 2=0 -> false
| x when a*a>x -> true
| x when x mod a=0 -> false
| _ -> is_prime n (a+2) and
l1 = [] and l2= [] in
let rec prime_sep l = match l with
| [] -> (l1,l2)
| h::t when is_prime h 3 = true -> h::l1 and prime_sep t
| h::t when is_prime h 3 = false -> h::l2 and prime_sep t;;

出什么问题了?

我不知道这是否太有用,但这是一个版本,我可以组合起来解决这个问题

let is_prime n =
  let n = abs n in
  let rec is_not_divisor d =
    d * d > n || (n mod d <> 0 && is_not_divisor (d + 1)) in
  n <> 1 && is_not_divisor 2;;


let prime_sep l = 
  let rec prime_sep_helper lst l1 l2 = 
    match lst with
    | [] -> (List.rev l1, List.rev l2)
    | h :: t -> 
      if is_prime h then
        prime_sep_helper t (h::l1) l2
      else
        prime_sep_helper t l1 (h::l2)
  in
  prime_sep_helper l [] [];

设为素数=
设n=absn
设rec不是除数d=
d*d>n | |(n模d0&&不是除数(d+1))in
n1&不是除数2;;
设素数=
设rec prime_sep_helper lst l1 l2=
匹配lst与
|[]->(List.rev l1,List.rev l2)
|h::t->
如果是素h,那么
素数sep辅助t(h::l1)l2
其他的
素数sep辅助t l1(h::l2)
在里面
素数sep_helper l[];

关键字
不是运算符。它用于建立一系列相互递归的定义

您需要有
&&
操作符

更新

更改为
和&
后,您至少还有一个问题。以下是代码的最后几行:

let rec prime_sep l = match l with
| [] -> (l1,l2)
| h::t when is_prime h 3 = true -> h::l1 && prime_sep t
| h::t when is_prime h 3 = false -> h::l2 && prime_sep t
OCaml中的
let
表达式类似于expr2中的
let v=expr1
。您有
expr1
(匹配表达式或更严格地说是包含此表达式的
fun
),但没有
expr2
。也就是说,您缺少
关键字中的
和后面的表达式

因为每个
let
表达式都需要
中的
,这是一个语法错误。但另一种说法是,您定义了一个名为
prime\u sep
的函数,但从未在任何地方调用它。如果在
中添加
,再加上一个调用,这就解决了这两个问题


我感觉还有更多的问题,但我希望这有助于取得进展。

“我在最后一行收到一条语法错误消息”在本例中始终包含该消息。@AlexeyRomanov当然,这篇文章已经编辑过了。。它们不能被搜索或复制,可用性差。相反,将代码作为文本直接粘贴到问题中。如果您选择它并单击
{}
按钮或Ctrl+K,代码块将缩进四个空格,这将导致它呈现为代码。我认为您只需要再添加一个
在最后,一切都会好起来的。有没有办法在
prime\u sep
中嵌套
Is\u prime
呢?当然有办法嵌套Is\u prime,就像你可以在prime\u sep\u助手上面写have Is\u prime一样,但我比较喜欢这种拆分样式,因为这样你的程序中的其他方法可以在需要时访问Is\u prime。你是说在最后两行?现在我有一个指向
;;的语法错误
,位于最后一行的末尾。当然,您需要修复
的两种用法,这两种用法由于相同的原因都是错误的。在这之后,您就有了
中没有匹配的
let rec prime_sep l = match l with
| [] -> (l1,l2)
| h::t when is_prime h 3 = true -> h::l1 && prime_sep t
| h::t when is_prime h 3 = false -> h::l2 && prime_sep t