A Haskell Quine

A Haskell quine. That is, a program whose output is itself.


main = putStr (s ++ [';',' ','s',' ','=',' '] ++ show s);
s = "main = putStr (s ++ [';',' ','s',' ','=',' '] ++ show s)"

To deal with string quoting, it is difficult to write a quine not assuming a particular encoding (e.g. ASCII). In Haskell, however, it is side-stepped by using the built-in show function for strings. See also the quine page.

Functional programmers would notice that such programs resembles the lambda expression (\x -> x x) (\x -> x x), which reduces to itself. As a simple extension, this self-expanding program inserts to itself one line of empty comment each time it is run. It resembles the Y combinator.

Yokoyama later came up with a more elegant quine.

8 thoughts on “A Haskell Quine

  1. Daniel Martin

    Why not take advantage of the function print, which combines putStr (well, putStrLn really) and show ?


    main = putStr s >> print s
    s = "main = putStr s >> print s\ns = "

    Alternatively, one can combine this into a single statement:


    main = (\s -> putStr s >> print s) "main = (\\s -> putStr s >> print s) "

    Reply
    1. John Tromp

      Assuming visibility of Control.Monad and Control.Monad.Reader, one can abbreviate further to

      main=liftM2(>>)putStr print"main=liftM2(>>)putStr print"

      Reply
        1. Shin Post author

          Thanks to both of you for submitting better quines (and sorry for slow response). I used to think that we need two kinds of quotes (” and ‘) to make it work. Obviously we do not!

          Reply

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>