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

  • Home
  • SEARCH
  • 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 250075
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 11, 20262026-05-11T21:28:50+00:00 2026-05-11T21:28:50+00:00

I’ve been reading a lot of stuff about functional programming lately, and I can

  • 0

I’ve been reading a lot of stuff about functional programming lately, and I can understand most of it, but the one thing I just can’t wrap my head around is stateless coding. It seems to me that simplifying programming by removing mutable state is like “simplifying” a car by removing the dashboard: the finished product may be simpler, but good luck making it interact with end-users.

Just about every user application I can think of involves state as a core concept. If you write a document (or a SO post), the state changes with every new input. Or if you play a video game, there are tons of state variables, beginning with the positions of all the characters, who tend to move around constantly. How can you possibly do anything useful without keeping track of changing values?

Every time I find something that discusses this issue, it’s written in really technical functional-ese that assumes a heavy FP background that I don’t have. Does anyone know a way to explain this to someone with a good, solid understanding of imperative coding but who’s a complete n00b on the functional side?

EDIT: A bunch of the replies so far seem to be trying to convince me of the advantages of immutable values. I get that part. It makes perfect sense. What I don’t understand is how you can keep track of values that have to change, and change constantly, without mutable variables.

  • 1 1 Answer
  • 2 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-11T21:28:51+00:00Added an answer on May 11, 2026 at 9:28 pm

    Or if you play a video game, there are
    tons of state variables, beginning
    with the positions of all the
    characters, who tend to move around
    constantly. How can you possibly do
    anything useful without keeping track
    of changing values?

    If you’re interested, here’s a series of articles which describe game programming with Erlang.

    You probably won’t like this answer, but you won’t get functional program until you use it. I can post code samples and say “Here, don’t you see” — but if you don’t understand the syntax and underlying principles, then your eyes just glaze over. From your point of view, it looks as if I’m doing the same thing as an imperative language, but just setting up all kinds of boundaries to purposefully make programming more difficult. My point of view, you’re just experiencing the Blub paradox.

    I was skeptical at first, but I jumped on the functional programming train a few years ago and fell in love with it. The trick with functional programming is being able to recognize patterns, particular variable assignments, and move the imperative state to the stack. A for-loop, for example, becomes recursion:

    // Imperative
    let printTo x =
        for a in 1 .. x do
            printfn "%i" a
    
    // Recursive
    let printTo x =
        let rec loop a = if a <= x then printfn "%i" a; loop (a + 1)
        loop 1
    

    Its not very pretty, but we got the same effect with no mutation. Of course, wherever possible, we like avoid looping altogether and just abstract it away:

    // Preferred
    let printTo x = seq { 1 .. x } |> Seq.iter (fun a -> printfn "%i" a)
    

    The Seq.iter method will enumerate through the collection and invoke the anonymous function for each item. Very handy 🙂

    I know, printing numbers isn’t exactly impressive. However, we can use the same approach with games: hold all state in the stack and create a new object with our changes in the recursive call. In this way, each frame is a stateless snapshot of the game, where each frame simply creates a brand new object with the desired changes of whatever stateless objects needs updating. The pseudocode for this might be:

    // imperative version
    pacman = new pacman(0, 0)
    while true
        if key = UP then pacman.y++
        elif key = DOWN then pacman.y--
        elif key = LEFT then pacman.x--
        elif key = UP then pacman.x++
        render(pacman)
    
    // functional version
    let rec loop pacman =
        render(pacman)
        let x, y = switch(key)
            case LEFT: pacman.x - 1, pacman.y
            case RIGHT: pacman.x + 1, pacman.y
            case UP: pacman.x, pacman.y - 1
            case DOWN: pacman.x, pacman.y + 1
        loop(new pacman(x, y))
    

    The imperative and functional versions are identical, but the functional version clearly uses no mutable state. The functional code keeps all state is held on the stack — the nice thing about this approach is that, if something goes wrong, debugging is easy, all you need is a stack trace.

    This scales up to any number of objects in the game, because all objects (or collections of related objects) can be rendered in their own thread.

    Just about every user application I
    can think of involves state as a core
    concept.

    In functional languages, rather than mutating the state of objects, we simply return a new object with the changes we want. Its more efficient than it sounds. Data structures, for example, are very easy to represent as immutable data structures. Stacks, for example, are notoriously easy to implement:

    using System;
    
    namespace ConsoleApplication1
    {
        static class Stack
        {
            public static Stack<T> Cons<T>(T hd, Stack<T> tl) { return new Stack<T>(hd, tl); }
            public static Stack<T> Append<T>(Stack<T> x, Stack<T> y)
            {
                return x == null ? y : Cons(x.Head, Append(x.Tail, y));
            }
            public static void Iter<T>(Stack<T> x, Action<T> f) { if (x != null) { f(x.Head); Iter(x.Tail, f); } }
        }
    
        class Stack<T>
        {
            public readonly T Head;
            public readonly Stack<T> Tail;
            public Stack(T hd, Stack<T> tl)
            {
                this.Head = hd;
                this.Tail = tl;
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                Stack<int> x = Stack.Cons(1, Stack.Cons(2, Stack.Cons(3, Stack.Cons(4, null))));
                Stack<int> y = Stack.Cons(5, Stack.Cons(6, Stack.Cons(7, Stack.Cons(8, null))));
                Stack<int> z = Stack.Append(x, y);
                Stack.Iter(z, a => Console.WriteLine(a));
                Console.ReadKey(true);
            }
        }
    }
    

    The code above constructs two immutable lists, appends them together to make a new list, and appends the results. No mutable state is used anywhere in the application. It looks a little bulky, but that’s only because C# is a verbose language. Here’s the equivalent program in F#:

    type 'a stack =
        | Cons of 'a * 'a stack
        | Nil
    
    let rec append x y =
        match x with
        | Cons(hd, tl) -> Cons(hd, append tl y)
        | Nil -> y
    
    let rec iter f = function
        | Cons(hd, tl) -> f(hd); iter f tl
        | Nil -> ()
    
    let x = Cons(1, Cons(2, Cons(3, Cons(4, Nil))))
    let y = Cons(5, Cons(6, Cons(7, Cons(8, Nil))))
    let z = append x y
    iter (fun a -> printfn "%i" a) z
    

    No mutable necessary to create and manipulate lists. Nearly all data structures can be easily converted into their functional equivalents. I wrote a page here which provides immutable implementations of stacks, queues, leftist heaps, red-black trees, lazy lists. Not a single snippet of code contains any mutable state. To “mutate” a tree, I create a brand new one with new node I want — this is very efficient because I don’t need to make a copy of every node in the tree, I can reuse the old ones in my new tree.

    Using a more significant example, I also wrote this SQL parser which is totally stateless (or at least my code is stateless, I don’t know whether the underlying lexing library is stateless).

    Stateless programming is just as expressive and powerful as stateful programming, it just requires a little practice to train yourself to start thinking statelessly. Of course, “stateless programming when possible, stateful programming where necessary” seems to be the motto of most impure functional languages. There’s no harm in falling back on mutables when the functional approach just isn’t as clean or efficient.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Ask A Question

Stats

  • Questions 174k
  • Answers 174k
  • Best Answers 0
  • User 1
  • Popular
  • Answers
  • Editorial Team

    How to approach applying for a job at a company ...

    • 7 Answers
  • Editorial Team

    What is a programmer’s life like?

    • 5 Answers
  • Editorial Team

    How to handle personal stress caused by utterly incompetent and ...

    • 5 Answers
  • Editorial Team
    Editorial Team added an answer ~ is a bash-ism rather than a perl-ism, which is… May 12, 2026 at 2:51 pm
  • Editorial Team
    Editorial Team added an answer This is wrong! Migrations should be used only for migrating… May 12, 2026 at 2:51 pm
  • Editorial Team
    Editorial Team added an answer foreach (record in recordset) {     if (!(Roles.RoleExists(record["Role"])) {… May 12, 2026 at 2:51 pm

Related Questions

I'm trying to decode HTML entries from here NYTimes.com and I cannot figure out
I ran into a problem. Wrote the following code snippet: teksti = teksti.Trim() teksti
I have a French site that I want to parse, but am running into
I have text I am displaying in SIlverlight that is coming from a CMS
I am currently running into a problem where an element is coming back from

Trending Tags

analytics british company computer developers django employee employer english facebook french google interview javascript language life php programmer programs salary

Top Members

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.