Ocaml 错误:未绑定的值为

Ocaml 错误:未绑定的值为,ocaml,Ocaml,我正在学习ocaml,我正在尝试编写一个简单的函数,它可以输出作为int参数给出的第一个参数 我所写的: let rec take(number, lista)= let rec take_acc(number, lista, acc)= match number with | 0 -> [] | number < 0 -> [] | number > lista.length ->

我正在学习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);;
我做错了什么

关键是该代码可以工作:

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);;
让xxl=11::33::54::74::[];;
让记录2(ile,xxx)=
如果ile=0 | | ile(List.length xxl),则取2(ile-1,xxx)
其他的
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);;
let rec take 2(ilosc,lista)=
让rec采取行动(ilosc、lista、acc)=
如果ilosc=0 | | ilosc<0,则[]
其他的
如果ilosc>List.length lista
然后是lista
其他的
采取行动(ilosc-1,列表A.tl,acc@lista.hd);;
让listas=1::2::3::4::5::6::[];;
take2(2,listas);;

还是一样

您的代码的语法格式不正确。因此,它永远无法达到说take没有定义的程度

首先要修复的是模式的使用。构造
number<0
不是一个模式,它是一个布尔表达式。在下列情况下,可以使用
将布尔值作为模式的一部分:

| _ when number < 0
当数字<0时,
|uu
然而,对于您想要测试的内容来说,这并不是特别好的样式。在测试中使用
if
可能更好


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

谢谢。我已经编辑了我的答案。你能帮我评论一下吗?这在语法上仍然不正确。我建议你把语法正确性作为你的第一个目标。
| _ when number < 0