On 08/05/07, Matthew Sackman <[EMAIL PROTECTED]> wrote:
> :t let f r s = let g (fn::forall n . (Num n) => n -> n) = return (fn r, fn s) in
(return negate) >>= g in f
Ah, I may have been off the mark earlier. I think the problem is due
to the fact that you can't pass higher-order polymorphic functions
around. I.e., the following is a classic example of something people
expect to work, but doesn't:
runST $ ...
runST is a rank-2 polymorphic function, and you're attempting to pass
it as a parameter to the ($) function, which doesn't work. I think
your problem is similar. Here's the module I used to investigate
goings on:
{-# OPTIONS_GHC -fglasgow-exts #-}
import Data.Complex
g :: (Num a, Num b, Monad m) => a -> b -> (forall n. Num n => n -> n)
-> m (a, b)
g r s fn = return (fn r, fn s)
f :: Maybe (Int, Complex Float)
f = return negate >>= g (4 :: Int) (1 :+ 2)
You're attempting to pass the rank-2 polymorphic function "g (4 ::
Int) (1 :+ 2)" as a parameter to (>>=), which doesn't work.
General point: couldn't GHC's error reporting be improved at times like these?
--
-David House, [EMAIL PROTECTED]
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe