# is identity the only polymorphic function without typeclasses?

Cagdas Ozgenc co19@cornell.edu
Mon, 3 Mar 2003 13:01:31 +0200

```> My three eurocents.
> I believe that the Author of the original query won't care more about
> undefined stuff than most of us. He wants truly polymorphic functions,
> of the type, say, a->b->a etc., without constraints.
>
> The answer exists, although it is not always trivial to find interesting
> examples.
>
> Imagine a (postulated) polymorphic type, say, (a->b)->(b->a) . Consider
> the symbol (->) to be an implication in logic. Ask yourself; "is it
> a tautology, valid for *any* objects of types "a" or "b"? If yes, then
> this is a type, and you can in principle find a model for it.
>
> Example: composition
>
> type: (a->b)->(c->a) -> (c->b)
> function: (.)
>    (.) f g x = f (g x)
>
> On the other hand the "type" (a->b) is *NOT* a valid theorem. This is not
> a type. You won't find any model of it. No, no, get out with your
> f x = undefined.
>
> The "subst" combinator:  subst f g x = f x (g x) has the type
>
> (a->b->c) -> (a->b) -> a -> c   (unless I've produced some mistake)

The time you grouped (a->b->c), you utilized the arrow type constructor to
build a function type, it is no different that using a polymorphic list. I
think I am not happy with the dual semantics of this arrow thingie. I have
to ponder on this some more, I guess.

Thanks for the response. Greatly appreciated.

```