Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 7529091
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 30, 20262026-05-30T04:33:55+00:00 2026-05-30T04:33:55+00:00

I have these these two functions //Remove all even indexed elements from a list

  • 0

I have these these two functions

//Remove all even indexed elements from a list and return the rest
let rec removeEven l =
match l with
| x0::x1::xs -> x1::removeEven (xs)
| [] -> []
| [_] -> []

//combine list members into pairs
let rec combinePair l =
match l with
| x0::x1::xs -> (x0,x1) :: combinePair(xs)
| [] -> []
| [_] -> []

That work.

But I thought now that I was at it that I might as well learn a bit about tail recursion which I’m having a hard time getting the grasp of.

That’s why I thought that if I could get some help making functions I had made myself tail-recursive perhaps it would become more clear how it works, instead of reading an example somewhere which I might not understand as well as my own code (remember, I’m a complete f# newbie :))

Any other constructive comments about my code are of course most welcome!

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-30T04:33:57+00:00Added an answer on May 30, 2026 at 4:33 am

    A typical way of making functions tail-recursive in F# is using a list (acc in this case) to accumulate results and reversing it to get the correct order:

    let removeEven l =
        let rec loop xs acc =
            match xs with        
            | [] | [_] -> acc
            | _::x1::xs' -> loop xs' (x1::acc)
        loop l [] |> List.rev
    
    let combinePair l =
        let rec loop xs acc =
            match xs with        
            | [] | [_] -> acc
            | x0::x1::xs' -> loop xs' ((x0, x1)::acc)
        loop l [] |> List.rev
    

    Since we simply return results after each recursive call of loop, these functions are tail-recursive.

    Your functions look quite nice, but I still have several comments:

    • Indentation is important in F#. I would prefer match... with is a few spaces behind lec rec declaration.
    • Patter matching cases should follow a consistent order. It’s a good idea to start with base cases first.
    • The function keyword is natural to use for shortening functions whenever you have a pattern of fun t -> match t with.
    • It’s better to get rid of unnecessary parentheses, especially in functions with one argument.

    Applying above comments, your functions become as follows:

    // Remove all even indexed elements from a list and return the rest
    let rec removeEven = function
        | [] | [_] -> []
        | _::x1::xs -> x1::removeEven xs
    
    // Combine list members into pairs
    let rec combinePair = function
        | [] | [_] -> []
        | x0::x1::xs -> (x0, x1)::combinePair xs
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I have these two functions (with Point2D & LineVector (has 2 Point2D member variables)
Let's say we have these two classes: public class Base { public static int
I have these two pieces of code, wich one is more readable? foreach decimal
I have these two modules : package G1; sub new { my $class =
I have these two classes public class Person { } public class Company {
I have these two situations: String s = aa; s = s + aa;
I have these two methods on a class that differ only in one method
Say you have these two methods: Number 1: void AddPerson(Person person) { // Validate
In AD we have these two OUs: OU=Accounts - Standard User OU=Accounts - Restricted
I have two form elements on my page that act as a smooth login

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.