[Haskell-cafe] function types as instances of Num

Simon Peyton-Jones simonpj at microsoft.com
Wed Nov 1 04:42:43 EST 2006


Try

test' = square . (4 :: a -> (Integer,a))

Otherwise, how is the compiler to know that you want 4 to be of that
type?

S

| -----Original Message-----
| From: haskell-cafe-bounces at haskell.org
[mailto:haskell-cafe-bounces at haskell.org] On Behalf Of Greg
| Buchholz
| Sent: 26 October 2006 18:46
| To: haskell-cafe at haskell.org
| Subject: [Haskell-cafe] function types as instances of Num
| 
| 
|     Let's say we've got a little stack language, where you compute
| things by transformations of stacks, using compositions of functions
| from stacks to stacks (represented here as nested tuples). (See also
| Chris Okasaki's "Techniques for Embedding Postfix Languages in
Haskell"
|  www.eecs.harvard.edu/~nr/ cs252r/archive/chris-okasaki/hw02.ps )
| 
|   For example, the simple program below calculates the square of 4...
| 
| > {-# OPTIONS -fglasgow-exts #-}
| >
| > main = print $ test ()
| >
| > test  = square . (lit 4)
| >
| > lit :: Integer -> a -> (Integer,a)
| > lit val stack    = (val, stack)
| >
| > dup  (a, b)      = (a, (a, b))
| > mult (a, (b, c)) = (b*a, c)
| > square = mult . dup
| 
| ...now let's say I find that using the function "lit" to annotation
| numeric literals ugly.  What I really want is something like...
| 
| > test' = square . 4
| 
| ...Seems simple enough, I'll just make an appropriate instance of Num
| and I'll be able to use fromInteger...
| 
| > instance Eq   (a -> (Integer, a))
| > instance Show (a -> (Integer, a))
| > instance Num  (a -> (Integer, a)) where
| >     fromInteger = lit
| 
| ...but now when I try it, GHC complains...
| 
|     No instance for (Num (a -> (Integer, t)))
|       arising from the literal `4' at final.hs:15:17
|     Possible fix:
|       add an instance declaration for (Num (a -> (Integer, t)))
|     In the second argument of `(.)', namely `4'
|     In the expression: square . 4
|     In the definition of `test'': test' = square . 4
| 
| ...so it seems that (a -> (Integer, t)) can't be unified with (a ->
| (Integer, a)), or somesuch.  Any thoughts on how to get this to work?
| 
| 
| Thanks,
| 
| Greg Buchholz
| 
| 
| _______________________________________________
| Haskell-Cafe mailing list
| Haskell-Cafe at haskell.org
| http://www.haskell.org/mailman/listinfo/haskell-cafe


More information about the Haskell-Cafe mailing list