Fixing Fix

Erik Hesselink hesselink at gmail.com
Tue Mar 24 16:28:38 UTC 2015


That seems slightly different, more related to indexed monads with
pre- and postconditions. They have many more type variables...

Erik

On Tue, Mar 24, 2015 at 5:20 PM, Oliver Charles <ollie at ocharles.org.uk> wrote:
> Higher order stuff is very useful, but I don't think it needs to belong in
> the same place as Data.Functor.Fix. Edward Kmett's 'indexed' library will
> probably deal with this, when we have a GHC that's smart enough to
> understand it ;)
>
> - Ollie
>
> On Tue, Mar 24, 2015 at 3:40 PM, Erik Hesselink <hesselink at gmail.com> wrote:
>>
>> Ugh, you're right, I renamed the variables and made a mistake. The
>> outer variable should stay the same of course, your signature is
>> correct.
>>
>> For a use site of HFix, see the multirec package [0], although that
>> might not really clarify things :) We also have a use internally, but
>> I just realized we can probably simplify that away.
>>
>> Regards,
>>
>> Erik
>>
>> [0]
>> http://hackage.haskell.org/package/multirec-0.7.5/docs/Generics-MultiRec-HFix.html
>>
>> On Tue, Mar 24, 2015 at 4:25 PM, David Feuer <david.feuer at gmail.com>
>> wrote:
>> > I have no comment on your higher-order version (because I don't
>> > understand
>> > it yet), but the type you give for hmap looks unlikely. Did you mean
>> >
>> > hmap :: (g :-> h) -> f g :-> f h ?
>> >
>> > On Mar 24, 2015 10:58 AM, "Erik Hesselink" <hesselink at gmail.com> wrote:
>> >>
>> >> On Tue, Mar 24, 2015 at 7:23 AM, M Farkas-Dyck <strake888 at gmail.com>
>> >> wrote:
>> >> > On 22/03/2015 at 23:01:47 -0400, David Feuer wrote:
>> >> >> There are a good number of different packages that define either
>> >> >>
>> >> >> newtype Fix f = Fix (f (Fix f))
>> >> >>
>> >> >> or something equivalent except for naming. Most of the name
>> >> >> variation
>> >> >> is in the name of the data constructor and/or record selector. This
>> >> >> does not look like an ideal situation to me. Most problematically,
>> >> >> the
>> >> >> only way to convert one to another is with unsafeCoerce.
>> >> >>
>> >> >> I think it would be rather nice to choose one canonical place for
>> >> >> this
>> >> >> definition, and let everyone else use it.
>> >> >
>> >> > +1
>> >> >
>> >> > I propose
>> >> >
>> >> > module Data.Fix where
>> >> >
>> >> > newtype Fix f = Fix { unFix :: f (Fix f) }
>> >>
>> >> I'm used to
>> >>
>> >>     newtype Fix f = In { out : f (Fix f) }
>> >>
>> >> But all the other suggestions look fine to me, too.
>> >>
>> >> I've also often used this variation:
>> >>
>> >>     newtype HFix f a = In { out :: f (HFix f) a }
>> >>
>> >> This allows you to take the fixed point of e.g. monad stacks and
>> >> indexed types. The function you propose below can then be a type class
>> >> function of an indexed Functor class:
>> >>
>> >>     type f :-> g = forall a. f a -> g a
>> >>
>> >>     class HFunctor f where
>> >>       hmap :: (a :-> b) -> f a :-> g a
>> >>
>> >> Does this deserve a place somewhere as well? Or is it too specialized?
>> >>
>> >> > Perhaps too we ought to name and define _ :: (∀ a . f a -> g a) ->
>> >> > Fix f
>> >> > -> Fix g there.
>> >>
>> >> Some variation of 'map' seems sensible, like 'hmap' (but see above) or
>> >> 'mapFix'.
>> >>
>> >> Erik
>> _______________________________________________
>> Libraries mailing list
>> Libraries at haskell.org
>> http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
>
>


More information about the Libraries mailing list