List Recursion in Ocaml

ε祈祈猫儿з 提交于 2021-02-11 14:01:47

问题


This is what I want to achive, to return to a list with values that are below the given value with recursion:

# list_below 3 [7; 1; 0; 3];;
   - : int list = [1; 0]
# list_below 1 [-7; 1; 0; 3];;
   - : int list = [-7; 0]
# list_below 9.0 [4.2; 3.6; 5.0; 12.8];;
   - : float list = [4.2; 3.6; 5.0]

Here is what I wrote so far, and it does not appear to return anything.

let rec list_below thresh lst = 
 if List.hd lst > thresh then [] else
  List.hd lst :: list_below thresh (List.tl lst);;
;;

Could you show me what is wrong with my code?


回答1:


The problem should be what Jeffrey has pointed out for you.

Your questions says you want to implement list_below, but your code shows list_above. I'll stick to list_below here.

Recursive functions in Ocaml can be made quite intuitively if you use pattern matching. For example, the below code should work :

let rec list_below thresh lst =
  match lst with
  | [] -> []
  | hd :: tl -> if hd < thresh then hd :: (list_below thresh tl)
            else list_below thresh tl;;



回答2:


If the first value is above the threshhold your code always returns an empty list. That can't be right. It is inconsistent with your first example, for one thing.




回答3:


You could try using List.filter. Since you want to get a list of values that are less than the supplied value, then filter should do what you want.

Here's the documentation for filter:

val filter : ('a -> bool) -> 'a list -> 'a list

filter p l returns all the elements of the list l that satisfy the predicate p. The order of the elements in the input list is preserved.

What you need is to provide a predicate p. A predicate is a function that takes an element and returns a boolean. Filter will take this predicate and apply to each value in the list. If the predicate returns true for that element, the element will be added to the resulting list.

So in your case, list_below should be

let list_below thresh lst =
    List.filter (fun elem -> elem < thresh) lst

More more operations on list, check out this chapter in Real World OCaml.



来源:https://stackoverflow.com/questions/52267786/list-recursion-in-ocaml

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!