Search code examples
haskellnewtype

Specifying Tuple in `newtype` Argument


Learn You a Haskell discusses newtype.

How does its signature of Pair b a mean that the passed-in argument must be a tuple?

ghci> newtype Pair b a = Pair { getPair :: (a, b) }
ghci> let p = Pair (5, 10)

I'm confused how b a indicates a tuple.


Solution

  • The reason you pass in a tuple is not in the type, but in its constructor:

    Pair { getPair :: (a, b) }
    

    This is using record syntax to define a Pair constructor with a single field called getPair, which contains a tuple. You could get a very similar effect by breaking it into two parts:

    newtype Pair b a = Pair (a, b)
    
    getPair (Pair (x, y)) = (x, y)
    

    So the b a does not force it to be a tuple; that's what the { getPair :: (a, b) } does.