What does the : infix operator do in Haskell?

Tag: haskell Author: woaixiaoxue111 Date: 2009-10-23

I'm reading A Gentle Introduction to Haskell (which is not so gentle) and it repeatedly uses the : operator without directly explaining what it does.

So, what exactly does it do?

It's not gentle at all. If this is your first contact with functional programming I recomend this site: learnyouahaskell.com After reading through this site then return to A Gentle Introduction. It really smooths the way a lot.

Best Answer

: is the “prepend” operator:

x : xs

Returns a list which has x as first element, followed by all elements in xs. In other functional languages, this is usually called cons, because it “cons”tructs a list recursivel by repeated application from an empty list:

1 : 2 : 3 : 4 : []

Is the list [1 2 3 4].

Other Answer1

Could always check out the types in GHCi/HUGS, as the first steps in the tutorial encourage you to download GHC/HUGS.

Prelude> :t (:)
(:) :: a -> [a] -> [a]
Prelude> :t (++)
(++) :: [a] -> [a] -> [a]

From their respective types, it's quite easy to deduce their usage.

PS: http://haskell.org/hoogle/ is awesome.

comments:

You're totally right. +1
Why thank you sir! If you download hoogle, you can use it as a function within ghc. It's pretty sweet. Allows you to search by type or function name without having to import, beats :t in every way.
Technically (:) could be x (:) xs = xs or x (:) xs = xs ++ [x]
I find :i to (sometimes) be a lot more informative than :t. :i (:) will give you data [] a = ... | a : [a], and :i [] will give you the complete list definition, data [] a = [] | a : [a].

Other Answer2

It is the type constructor for lists. It is no different from any other type constructor like Just or Left, except that it is infix. Valid type constructors can either be words starting with a capital letter, or symbols starting with a colon.

So you can define infix constructors for your own data types. For example:

data MyList a = a :> MyList a
              | Empty

in the above code we define a type called MyList with two constructors: the first is a weird-looking constructor :> which takes an element and another MyList a; the second is an empty constructor Empty which is equivalent to [] in Haskell's native lists.

The above is equivalent to :

data MyList a = Cons a  (MyList a)
              | Empty

Other Answer3

According to the first result in Google for "haskell colon operator":

x : y inserts item x at the beginning of list y. (unlike ++ operator which combines two lists).

Other Answer4

The : operator in Haskell is the constructor for lists. It 'cons' whatever is before the colon onto the list specified after it.

For instance, a list of integers is made by 'consing' each number onto the empty list, e.g;

The list [1,2,3,4] is made by 4 : [] (consing 4 to the empty list)

3 : [4] (consing 3 onto the list containing 4)

2 : [3,4] (consing 2 onto the list containing 3, 4)

1 : [2,3,4] (consing 1 onto the list containing 2,3,4)

giving you;

[1,2,3,4]

Written fully that's;

1 : 2 : 3 : 4 : []