为什么If语句在以下OCaml程序中显示错误?

时间:2016-08-20 17:46:21

标签: ocaml

我是OCaml的新手,请帮助我了解以下错误的原因。

let rec union l1 l2= match l2 with
 []->l1
 |x::xs->if not(List.mem x l1) then l1@[x];union l1 xs ;;

Characters 80-86:
   |x::xs->if not(List.mem x l1) then l1@[x];union l1 xs;;
                                      ^^^^^^   
  

错误:此表达式具有类型'列表              但是预期表达式为单位

2 个答案:

答案 0 :(得分:0)

没有if的{​​{1}}需要输入else类型,但您的类型为unit。可以这样想:如果你的情况是假的,你期望你的函数返回什么?

PS:'a list是一个没有任何副作用的表达式。将它作为一个自己的声明,而不对其结果做任何事情。您可能希望将l1 @ [x]用作l1@[x]的第一个参数,而不只是union

答案 1 :(得分:0)

您要实施的算法是:

app = Flask(__name__) app.config['DEBUG'] = True 为空时,返回l2,否则返回l1时:

  • l2 = x::xs的末尾添加x(如果已经存在
  • 使用l1和新l2 = xs
  • 递归调用该过程

这不是您的实施所达到的目标。

您的实施执行以下操作: 创建列表l1,不做任何事情。然后进行递归调用。

要使用值l1@[x],您需要将其绑定到某个名称,例如:

l1@[x]

在这里,我还完成了必要的let rec union l1 l2= match l2 with []->l1 | x::xs-> if not(List.mem x l1) then let newl1 = l1@[x] in union newl1 xs else union l1 xs 分支,并附有一些有意义的陈述。

你甚至不需要找一个名字,你可以直接写出等价物:

else