如何解决代码最后一行的错误是什么?
我正在编写将整数列表作为输入并将质数和合数分成两个列表的函数:
#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;;
我在最后一行收到一条语法错误消息:
Error: Syntax error
Characters 348-349:
| h::t when is_prime h 3 = false -> h::l2 and prime_separator t
^
怎么了?
解决方法
关键字 and
不是运算符。用于构建一系列相互递归的定义。
您需要 &&
运算符,其中有 and
。
更新
将 and
更改为 &&
后,您仍然至少有一个问题。这些是代码的最后几行:
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
表达式看起来像 let v = expr1 in expr2
。您有 expr1
(匹配表达式或更严格地说是包含此表达式的 fun
),但您没有 expr2
。即,您缺少 in
关键字和后面的表达式。
因为每个 let
表达式都需要一个 in
,所以这是一个语法错误。但另一种说法是你定义了一个名为 prime_sep
的函数,但你永远不会在任何地方调用它。如果您添加 in
和调用,这可以解决这两个问题。
我感觉还有更多问题,但我希望这有助于取得进展。
,我不知道这是否有帮助,但这是我能够为解决问题而拼凑的版本。
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 [] [];
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。