简体   繁体   中英

How to double elements in an F# list and set them in a new list

I am very new to F# and functional programming in general, and would like to recursively create a function that takes a list, and doubles all elements.

This is what I used to search for a spacific element, but im not sure how exactly I can change it to do what I need.

let rec returnN n theList =
    match n, theList with
    | 0, (head::_) -> head
    | _, (_::theList') -> returnN (n - 1) theList'
    | _, [] -> invalidArg "n" "n is larger then list length"

let list1 = [5; 10; 15; 20; 50; 25; 30]   
printfn "%d" (returnN 3 list1 )

Is there a way for me to augment this to do what I need to?

I would like to take you through the thinking process.

Step 1. I need a recursive function that takes a list and doubles all the elements:

So, let's implement this in a naive way:

let rec doubleAll list = 
    match list with
    | []       -> []
    | hd :: tl -> hd * 2 :: doubleAll tl

Hopefully this logic is quite simple:

If we have an empty list, we return another empty list.

If we have a list with at least one element, we double the element and then prepend that to the result of calling the doubleAll function on the tail of the list.

Step 2. Actually, there are two things going on here:

  1. I want a function that lets me apply another function to each element of a list.
  2. In this case, I want that function to be "multiply by 2".

So, now we have two functions, let's do a simple implementation like this:

let rec map f list =
    match list with
    | []       -> []
    | hd :: tl -> f hd :: map f tl

let doubleAll list = map (fun x -> x * 2) list

Step 3. Actually, the idea of map is such a common one that it's already built into the F# standard library, see List.map

So, all we need to do is this:

let doubleAll list = List.map (fun x -> x * 2) list

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM