我的tree定义类型如下
type 'a tree = Leaf of 'a | Node of 'a * 'a tree * 'a tree ;;
Run Code Online (Sandbox Code Playgroud)
我有一个函数来查找树的深度如下
let rec depth = function
| Leaf x -> 0
| Node(_,left,right) -> 1 + (max (depth left) (depth right))
;;
Run Code Online (Sandbox Code Playgroud)
这个函数不是尾递归的.有没有办法让我以尾递归的方式编写这个函数?
我编写了以下代码,从列表中随机选择n个项目,并将选择放在新列表中.代码如下
let random_extract list n =
let l = ((List.length list)- 1)
and acc = [] in
for i = 1 to n do
(List.nth list (Random.int l) ) :: acc (* Line 447 *)
done;
acc
;;
Run Code Online (Sandbox Code Playgroud)
当我加载包含此代码的文件时,我收到以下错误
File "all_code.ml", line 447, characters 2-40:
Warning 10: this expression should have type unit.
val random_extract : 'a list -> int -> 'b list = <fun>
Run Code Online (Sandbox Code Playgroud)
两个问题,问题1:这个警告意味着什么.
其次,当我运行这个函数时,我没有得到预期的列表,但是一个空列表.
问题2:如何从for循环中获取acc的值
我有一个(int*string)元组,我想将其转换为列表.元组的形式为(N,E),其中N是元素E的出现次数.函数应该返回一个列表,其中包含N个出现的E.示例如下.让我们假设这个函数叫做tuple_decode.
tuple_decode (1, "A") -> ["A"]
tuple_decode (2,"B") -> ["B";"B"]
tuple_decode (4,"C") - > ["C";"C";"C";"C"]
Run Code Online (Sandbox Code Playgroud)
tuple_decode函数如下
let tuple_decode acc (n,elem) =
let add_one_elem i =
match i with
0 -> acc
| i -> elem :: acc ; add_one_elem (i-1) (* Line 184 *)
in
add_one_elem n
;;
Run Code Online (Sandbox Code Playgroud)
当我尝试编译此函数时,我收到以下错误.
File "all_code.ml", line 184, characters 11-22:
Warning 10: this expression should have type unit.
File "all_code.ml", line 184, characters 25-37:
Error: Unbound value add_one_elem
Run Code Online (Sandbox Code Playgroud)
有人可以帮我弄清楚为什么我会收到此错误并发出警告.
问候普纳特