
El 17/5/19 a las 13:01, Jack Kelly escribió:
Juan Miguel Vilar
writes: El 17/5/19 a las 11:56, ALeX Kazik escribió:
Now, the problem is what can I do to have a type that contains a single Int? Is there a sort of id for types so that I can write
Identity is the solution
Thank you Alex, but this forces the use of runIdentity. [...] Sometimes they will use lists, sometimes simple times, and would like that to be as transparent as possible.
I do not like the sibling thread's suggestion of using closed type families, because I think the regulatity of always having the `f t` present is a nicer aesthetic. Using a type family to unwrap the `Identity` makes it noisier to write functions that consume your structure and are polymorphic in `f`.
You can alleviate some of the syntactic noise of `runIdentity` with careful choices of type aliases or other helper functions. The type aliases (and `runFoo` functions) for monad transformers are good examples, and the `(==>)` function in dependent-sum[1] is a good additional example of the latter. To save you the click, DSum in dependent-sum is defined like this:
data DSum tag f where !(tag a) :=> f a
The (==>) helper is defined like this:
(==>) :: Applicative f => tag a -> a -> DSum tag f tag ==> a = tag :=> f a
So when f ~ Identity (or any other Applicative), the machinery becomes that much easier to use.
-- Jack
[1]: https://hackage.haskell.org/package/dependent-sum-0.5/docs/Data-Dependent-Su...
Thank you, Jack: I can't see the sibling thread you mentioned. On the other hand, as I said it is sort of an aesthetic question, so I think I can live with Identity. Juan Miguel -- Juan Miguel Vilar Torres Profesor titular de universidad Departamento de Lenguajes y Sistemas Informáticos Escuela Superior de Tecnología y Ciencias Experimentales Universitat Jaume I Av. de Vicent Sos Baynat s/n 12071 Castelló de la Plana (Spain) Tel: +34 964 72 8365 Fax: +34 964 72 8435 jvilar@uji.es