Error: Unbound value take

Error: Unbound value take

我正在学习 ocaml,我正在尝试编写简单的函数,打印出作为参数 int 给出的第一个。

我写的内容:

let rec take(number, lista)=
    let rec take_acc(number, lista, acc)=
        match number with
          | 0 -> []
          | number < 0 -> []
          | number > lista.length -> lista
          | number < lista.length -> take_acc(number-1, lista.tl, acc@lista.head);;
   take_acc(number, lista, [])

let listas = 1 :: 2 :: 3 :: 4 :: 5 :: 6 :: [];;
take(2,listas);;

关键是,上面给出的代码给我错误:

Error: Unbound value take

我做错了什么?

关键是这段代码有效:

let xxl = 11 :: 33 :: 54 :: 74 :: [];; 
let rec take2 (ile,xxx) = 
if ile=0 || ile<0 then []
else 
if ile>(List.length xxl) then take2(ile-1,xxx)
else 
List.hd xxx :: take2(ile-1,List.tl xxx);;

这两个程序有什么区别?

编辑: 由于 Jeffrey Scofield 的建议,我写了这样的东西:

let rec take2(ilosc, lista) =
   let rec take_acc(ilosc, lista, acc) =
       if ilosc = 0 || ilosc < 0 then []
       else
         if ilosc > List.length lista
            then lista
         else
            take_acc(ilosc-1, lista.tl, acc@lista.hd);;

let listas = 1 :: 2 :: 3 :: 4 :: 5 :: 6 :: [];;
take2(2,listas);;

还是一样。

您的代码的语法结构不正确。所以它永远无法达到说 take 未定义的地步。

首先要解决的是您对模式的使用。构造 number < 0 不是一个模式,它是一个布尔表达式。您可以使用 when:

将布尔值作为模式的一部分
| _ when number < 0

但是,对于您要测试的内容来说,这不是特别好的样式。最好只使用 if 进行测试。

接下来要解决的问题可能是您对 lista.length 的使用。在 OCaml 中获取列表长度的方法是 List.length lista.