[Haskell-cafe] Strange type behavior in GHCi 6.4.2
Chris Kuklewicz
haskell at list.mightyreason.com
Sat Dec 2 15:05:27 EST 2006
Grady Lemoine wrote:
> Hello,
>
> I've been playing around with Dan Piponi's work on automatic
> differentiation (from
> http://sigfpe.blogspot.com/2005/07/automatic-differentiation.html and
> http://sigfpe.blogspot.com/2006/09/practical-synthetic-differential.html)
> and I'm getting some odd behavior with the inferred types of functions
> in GHCi 6.4.2. My test case is as follows:
>
>> data Dual a = D a a deriving (Show,Eq)
>
>> instance Num a => Num (Dual a) where
>> fromInteger i = D (fromInteger i) 0
>> (D a a')+(D b b') = D (a+b) (a'+b')
>> (D a a')-(D b b') = D (a-b) (a'-b')
>> (D a a')*(D b b') = D (a*b) (a*b'+a'*b)
>
>> evalDeriv f x = (v, v')
>> where D v v' = f (D x 1)
>
>> f x = x^3
>
>> f' = snd . (evalDeriv f)
>
> When I load this in GHCi, I get:
>
> *Main> :t f
> f :: (Num a) => a -> a
> *Main> :t snd . (evalDeriv f)
> snd . (evalDeriv f) :: (Num a, Num (Dual a)) => a -> a
> *Main> :t f'
> f' :: Integer -> Integer
>
> Why is the type of f' Integer -> Integer, especially when the type of
> the expression it's defined as is more general? Is this something I'm
> not understanding about Haskell, or is it more to do with GHC 6.4.2
> specifically?
>
> Any help appreciated,
>
> --Grady Lemoine
You have two different things making this error possible. First there is the
default(Integer,Int) that Haskell implicitly provides. Second, there is the
monomorphism restriction.
Try this:
> default ()
>
> data Dual a = D a a deriving (Show,Eq)
>
> instance Num a => Num (Dual a) where
> fromInteger i = D (fromInteger i) 0
> (D a a')+(D b b') = D (a+b) (a'+b')
> (D a a')-(D b b') = D (a-b) (a'-b')
> (D a a')*(D b b') = D (a*b) (a*b'+a'*b)
> abs _ = error "no abs"
> signum _ = error "no signum"
>
> evalDeriv f x = (v, v')
> where D v v' = f (D x 1)
>
> f x = x^(3::Int)
>
> f' :: (Num a) => a -> a
> f' = snd . (evalDeriv f)
I played with such things, as seen on the old wiki:
http://haskell.org/hawiki/ShortExamples_2fSymbolDifferentiation
--
Chris
More information about the Haskell-Cafe
mailing list