我正在学习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);;
还是一样。
答案 0 :(得分:2)
您的代码语法不完善。因此,它无法达到说未定义的意义。
要解决的第一件事是你使用模式。构造number < 0
不是一个模式,它是一个布尔表达式。您可以使用when
:
| _ when number < 0
然而,对于您想要测试的内容,这并不是一个特别好的风格。最好只使用if
进行测试。
要解决的下一件事可能是您使用lista.length
。获取OCaml中列表长度的方法是List.length lista
。