错误:取消绑定值

时间:2015-03-18 21:45:53

标签: ocaml

我正在学习ocaml而我正在尝试编写简单的函数,该函数打印出作为参数int&#39的sirs。

我写的内容:

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);;

还是一样。

1 个答案:

答案 0 :(得分:2)

您的代码语法不完善。因此,它无法达到说未定义的意义。

要解决的第一件事是你使用模式。构造number < 0不是一个模式,它是一个布尔表达式。您可以使用when

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

然而,对于您想要测试的内容,这并不是一个特别好的风格。最好只使用if进行测试。

要解决的下一件事可能是您使用lista.length。获取OCaml中列表长度的方法是List.length lista