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