[Haskell-cafe] What's the problem with iota's type signature?

wren ng thornton wren at freegeek.org
Thu May 28 00:40:00 EDT 2009


michael rice wrote:
> Still exploring monads. I don't understand why the type signature for double is OK,

It isn't. The |a| and |b| variables must unify:

     Prelude> :t \x -> Just (x+x)
     \x -> Just (x+x) :: (Num a) => a -> Maybe a

     Prelude> :t (\x -> Just (x+x)) :: Num a => a -> Maybe b
     <interactive>:1:13:
         Couldn't match expected type `b' against inferred type `a'
           `b' is a rigid type variable bound by
               the polymorphic type `forall a b. (Num a) => a -> Maybe b'
                 at <interactive>:1:0
           `a' is a rigid type variable bound by
               the polymorphic type `forall a b. (Num a) => a -> Maybe b'
                 at <interactive>:1:0
         In the first argument of `Just', namely `(x + x)'
         In the expression: Just (x + x)


> but not the one for iota.

Again the |a| and |b| must unify.
Also, Int isn't a type class (did you mean Num?)
Also, the use of (..) requires the Enum class.

     Prelude> :t \n -> [1..n]
     \n -> [1..n] :: (Enum t, Num t) => t -> [t]

     Prelude> [3,4,5] >>= (\n -> [1..n])
     [1,2,3,1,2,3,4,1,2,3,4,5]

-- 
Live well,
~wren


More information about the Haskell-Cafe mailing list