[Haskell] Rank-N types with (.) composition

Dan Doel dan.doel at gmail.com
Tue Feb 10 23:31:05 UTC 2015


There is no special type for ($). The name is simply special cased in the
compiler. The rule is something like:

    Whenever you see: f Prelude.$ x
    instead try to type check: f x

That may not be the exact behavior, but it's close. To fix (.) (in a
similar fashion) you would have to have a similar rule, like:

    Whenever you see: f Prelude.. g
    instead try to type check: \x -> f (g x)

-- Dan

On Tue, Feb 10, 2015 at 6:19 PM, Tyson Whitehead <twhitehead at gmail.com>
wrote:

> On February 10, 2015 16:28:56 Dan Doel wrote:
> > Impredicativity, with regard to type theories, generally refers to types
> > being able to quantify over the collection of types that they are then a
> > part of. So, the judgment:
> >
> >     (forall (a :: *). a -> a) :: *
> >
> > is impredicative, because we have a type in * that quantifies over all
> > types in *, which includes itself. Impredicativity in general refers to
> > this sort of (mildly) self-referential definition.
>
> Thanks Dan and David,
>
> That was informative.  Also very interesting that ($) is a special case.
> I tried this
>
>  newtype Wrap = Wrap { extract :: forall f. Functor f => f Int }
>
>  trip'' :: Wrap -> Wrap
>  trip'' a = Wrap $ extract a
>
> and the compiler was happy.  Wrapping ($) as ($') gave an error as you
> implied it would
>
>  trip''' :: Wrap -> Wrap
>  trip''' a = Wrap $' extract a
>      where ($') = ($)
>
> With regard to my earlier comment about translating the (.) version
>
>  trip' :: Wrap -> Wrap
>  trip' = Wrap . extract
>
> to core, I can see it's actually okay.  A most you may need is a lambda to
> float the implicit parameters backwards
>
>  trip' :: Wrap -> Wrap
>  trip' = Wrap . (\a f fDict -> extract f fDict a)
>
> as GHC seems to always float them as far leftward as possible
>
>  extract :: Functor f => Wrap -> f Int
>
> I take it there are no user supplied types a person can give to overcome
> the predicative assumption?
>
> Out of curiosity, how would you write the special internal type that ($)
> has that separates it from ($') above?
>
> Thanks!  -Tyson
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell/attachments/20150210/82bb107e/attachment.html>


More information about the Haskell mailing list