[Haskell-cafe] Splitting HList
adam vogt
vogt.adam at gmail.com
Fri Jun 13 19:44:42 UTC 2014
Hi Gautier,
> So, you mean that there is no way to fit a (* -> * -> *) or so when a (* ->
> *) is required?
No.If you decide on a kind signature ([k], [k]), you have to use '(,)
not (,) when making types for that kind. Similarly if you have a type
[xs], the kind of that is * which doesn't match the kind [k] you
specify.
> For example, this week I worked on a zipWith ($) version for HList, I have
> this code:
> data HApL :: [*] -> [*] -> * where
> Nil2 :: HApL '[] '[]
> (:**) :: (a -> b) -> HApL as bs -> HApL (a ': as) (b ': bs)
>
> infixr 5 :**
>
> zipWithHApL :: HApL xs ys -> HList xs -> HList ys
> zipWithHApL Nil2 HNil = HNil
> zipWithHApL (x :** xs) (HCons y ys) = x y `HCons` zipWithHApL xs ys
>
> It doesn't satisfy me because:
> 1. I had to create an ad hoc data-type to manage it, instead of [] deal
> with it out-of-the-box
> 2. There no easy way to convert HList to HApL
>
> There is no way to get HList closer than List?
I'm not sure. With the HList library on hackage, you can do the equivalent of
zipWithDollar xs ys = map ($) (zip xs ys)
by defining:
data Dollar = Dollar
instance (fx ~ (x -> y, x)) => ApplyAB Dollar fx y where
applyAB _ (f,x) = f x
hZipWithDollar xs ys = hMap Dollar (hZip xs ys)
It works like:
>>> hZipWithDollar (hBuild (+1) tail) (hBuild 3 "ab")
H[4, "b"]
But in more complicated cases there is a tendency to need
-XAllowAmbiguousTypes, which means writing type signatures (with
-XScopedTypeVariables) that should be unnecessary.
Regards,
Adam
More information about the Haskell-Cafe
mailing list