[Haskell-cafe] Existential question
Tom Schouten
tom at zwizwa.be
Sat Aug 20 23:26:44 CEST 2011
On 08/18/2011 07:27 AM, oleg at okmij.org wrote:
>> -- Is there a way to make this one work also?
>> data Kl i o = forall s. Kl (i -> s -> (s, o))
>> iso :: (i -> Kl () o) -> Kl i o
>> iso f = Kl $ \i s -> (\(Kl kl) -> kl () s) (f i)
> Yes, if you move the quantifier:
>
> type Kl i o = i -> Kl1 o
> data Kl1 o = forall s. Kl1 (s -> (s,o))
> iso :: (i -> Kl () o) -> Kl i o
> iso f = \i -> f i ()
>
> iso1 :: Kl i o -> (i -> Kl () o)
> iso1 f = \i -> (\() -> f i)
>
Thanks, Oleg.
> I'm not sure if it helps in the long run: the original Kl and mine Kl1
> are useless. Suppose we have the value kl1 :: Kl Int Bool
> with the original declaration of Kl:
>
> data Kl i o = forall s. Kl (i -> s -> (s, o))
>
I had simplified the type to make the plumbing simpler. My intention
was to include an initial value to use the function as a sequence
transformer / generator:
data Kl i o = forall s. Kl s (i -> s -> (s, o))
This is an Arrow. At first I wondered if there was also an associated
Monad, hence the iso function. From your reply and Ryan's comment it
seems that making a Monad instance for
data Kl1 o = forall s. Kl (s -> (s,o))
is not possible because its bind function cannot be typed as the (i ->
Kl1 o) function introduces a value -> type dependency.
Does the "growing type" s1 -> s2 -> (s1,s2) in the bind-like method
below support some other abstraction that is monad-like?
data Kl1' s o = Kl1' (s -> (s,o))
bind' :: (Kl1' s1 i) -> (i -> Kl1' s2 o) -> (Kl1' (s1,s2) o)
bind' mi f = Kl1' mo where
mo (s1,s2) = ((s1',s2'),o) where
(Kl1' u1) = mi
(s1', i) = u1 s1
(Kl1' u2) = f i
(s2', o) = u2 s2
More information about the Haskell-Cafe
mailing list