On May 20, 2010, at 3:18 AM, Brent Yorgey wrote:

On Wed, May 19, 2010 at 04:27:14AM +0000, R J wrote:

What are some simple functions that would naturally have the following type signatures:
f :: (Integer -> Integer) -> Integer

Well, this means f is given a function from Integer to Integer, and it
has to somehow return an Integer, (possibly) using the function it is
given.  For example, f could just ignore its argument:

 f _ = 6

That would NOT give f the right type.
The type would be
        f :: Num r => a -> r


Or it could apply it to a particular input value:

 f g = g 0

That would NOT give f the right type.
The type would be
        f :: Num a => (a -> b) -> b


I'll let you think of some other possibilities.

The key point is the 'that would NATURALLY have', which I take
to mean "as a result of type inference without any forcibly
imposed type signatures".

What kind of definition of f, *not* including "::" anywhere,
would result in Haskell inferring the desired signature?

The key thing is that the types *must* be fully constrained
to Integer.  The simplest way to get something that is
guaranteed to be the specific type Integer, as far as I can
see, is to use something like "toInteger 0".

If we have identityForA :: A -> A
           identityForB :: B -> B
then we can constrain a variable x to A using identityForA $ x
and we can constrain a variable g to A->B using
identityForB . g . identityForA.

This is, in a sense, equivalent to providing a type signature,
but it meets the formal requirements of these questions.

identityForInteger = (+ toInteger 0)

is an example.

f g = g z + z where z = toInteger 0

does the trick here.
m% ghci
Prelude> let f g = g z + z where z = toInteger 0
Prelude> :type f
f :: (Integer -> Integer) -> Integer


_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to