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 6072123
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 23, 20262026-05-23T10:07:31+00:00 2026-05-23T10:07:31+00:00

I wrote the following code, which takes a bunch of points and draws them

  • 0

I wrote the following code, which takes a bunch of points and draws them on the screen using the gloss library.

let s = blocks pes
    pts = map (map mkPt) s  {- stitches to points-}
    lines = map Line pts    {-points to lines -}
    pict = Pictures lines   {- lines to a picture -}
  in do  displayInWindow "My Window" (200, 200) (10, 10) white pict

It works fine, but it occurs to me that there’s a repeated pattern: a chain of function calls, the result of each one feeding into the last argument of the next.
So I refactored by removing the intermediate variables, reversing the order and chaining the functions with function composition (“.”) like so:

let pict = Pictures . (map Line) . (map $ map $ mkPt) . blocks $ pes
                in do  displayInWindow "My Window" (200, 200) (10, 10) white pict

Happily, this works just fine too. But I’m wondering if I’m straining readability, or if I’m just not used to reading & writing point free style code. Also, how do I reason about this code? Is the second version more efficient, or just terser? Is there anything I can do stylistically to make it clearer?

  • 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-23T10:07:31+00:00Added an answer on May 23, 2026 at 10:07 am

    A few quick suggestions:

    let pict = Pictures . (map Line) . (map $ map $ mkPt) . blocks $ pes
    in do displayInWindow "My Window" (200, 200) (10, 10) white pict
    

    You’ve got some superfluous stuff that can be removed outright:

    let pict = Pictures . map Line . (map $ map mkPt) . blocks $ pes
    in do displayInWindow "My Window" (200, 200) (10, 10) white pict
    

    You’re not avoiding parentheses anyway with the map (map mkPt) term, so get rid of the $:

    let pict = Pictures . map Line . map (map mkPt) . blocks $ pes
    in do displayInWindow "My Window" (200, 200) (10, 10) white pict
    

    You can write the composition chain on multiple lines for clarity:

    let pict = Pictures 
             . map Line 
             . map (map mkPt) 
             . blocks $ pes
    in do displayInWindow "My Window" (200, 200) (10, 10) white pict
    

    The do block is superfluous because it only has one statement, and you can move the final application outside the definition:

    let displayPict = displayInWindow "My Window" (200, 200) (10, 10) white
                    . Pictures 
                    . map Line 
                    . map (map mkPt) 
                    . blocks
    in displayPict pes
    

    You can merge the two maps:

    let displayPict = displayInWindow "My Window" (200, 200) (10, 10) white
                    . Pictures 
                    . map (Line . map mkPt) 
                    . blocks
    in displayPict pes
    

    Sometimes it’s also more readable for long chains to use the reversed composition operator from Control.Arrow:

    let displayPict = blocks
                      >>> map (Line . map mkPt) 
                      >>> Pictures
                      >>> displayInWindow "My Window" (200, 200) (10, 10) white
    in displayPict pes
    

    But all of that is optional; season your code to taste.

    On the subject of efficiency, I see no reason to think the two would be any different, once GHC’s optimizer is through with the code.

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

Sidebar

Related Questions

I'm working with the jQuery Validation plugin and I wrote the following code which
So I wrote the following code in linux(Ubuntu) using the emacs text editor it
I wrote a Haskell code which has to solve the following problem : we
i wrote following code to create a linkbutton programmatically, but its showing like lable
I wrote following code...but i am getting Error like: Error 1 'LoginDLL.Class1.Login(string, string, string)':
I wrote the following code to induce a crash (I was testing out some
I wrote the following code for solving a problem but it doesn't work. The
if wrote the following code and do not understand why the trace returns false:
I wrote the following code: import java.lang.*; import DB.*; private Boolean validateInvoice(String i) {
I wrote the following code snippet in VS2010: #pragma once #include stdafx.h #ifndef SECURITY_WIN32

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.