[Haskell-cafe] Existential question

MigMit miguelimo38 at yandex.ru
Wed Aug 24 10:08:01 CEST 2011


Ehm... what? How can you do such a replacement without losing, for example, functions like this:

f (KI s h) i = snd $ h i $ fst $ h i s

Отправлено с iPad

24.08.2011, в 11:43, oleg at okmij.org написал(а):

> 
>> 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))
> 
> That change makes a world of difference! For example, the above type
> (Kl i) is clearly a monad
> 
>> instance Monad (Kl i) where
>>    return x = Kl () (\_ s -> (s,x))
>>    (Kl s m) >>= f = Kl s (\i s -> case f (snd (m i s)) of
>>                           Kl s' m' -> (s,snd (m' i s')))
> 
> 
> It is the Reader monad. Different Kl values have their own, private s.
> The quantification ensures that each encapsulated 's' applies only to
> its generator. Therefore, we can just as well apply that 's' right at
> the very beginning. Therefore,
> 
>> data Kl i o = forall s. Kl s (i ->  s ->  (s, o))
> 
> is essentially
> 
>> data Kl' i o = Kl' (i -> o)
> 
> which is certainly and Arrow and a Monad. We do not need existential
> at all. The web page
>    http://okmij.org/ftp/Computation/Existentials.html
> describes other eliminations of Existentials.
> 
> 
>> 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
> 
> Not all things are monads; for example, restricted and parameterized
> monads are not monads (but do look like them, enough for the
> do-notation). Your Kl1' does look like another generalization of
> monads. I must say that it seems to me more fitting for a parametrized
> applicative:
> 
>> class Appish i where
>>    purish :: a -> i s a
>>    appish :: i s1 (a ->b) -> i s2 a -> i (s1,s2) b
>> 
>> data KL s a = KL (s -> (s,a))
>> 
>> instance Appish KL where
>>    purish x = KL (\s -> (s,x))
>>    appish (KL f1) (KL f2) = KL $ \(s1,s2) ->
>>      let (s1', ab) = f1 s1
>>          (s2', a)  = f2 s2
>>      in ((s1',s2'), ab a)
> 
> 
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe



More information about the Haskell-Cafe mailing list