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
.
我正在学习 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
.