Sebastian Fischer wrote:
Heinrich Apfelmus wrote:

[...] you can implement your type as

  newtype CMaybe a = CMaybe { forall b . (a -> [b]) -> [b] }

Yes. For me it was interesting to see how far we get by wrapping `Maybe` in `Codensity`: we get more than `Maybe` but not as much as `[]`.

Well, you can implement it with Maybe as well, at the price of duplicated computations. The idea is that for the implementation of orElse , we're not interested in the full list of results, only in whether this list is empty or not. This leads to

   eval :: ProgramView Language a -> Maybe a
   eval (Return a   :>>= k) = Just a
   eval (MZero      :>>= k) = Nothing
   eval (MPlus n m  :>>= k) = (eval . view) (n >>= k)
                      `mplus` (eval . view) (m >>= k)
   eval (OrElse n m :>>= k) = case (eval . view) n of
       Nothing -> (eval . view) (m >>= k)
       Just _  -> (eval . view) (n >>= k)

Thanks to lazy evaluation, this is not too inefficient, even.


Regards,
Heinrich Apfelmus

--
http://apfelmus.nfshost.com

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to