On Thu, Aug 08, 2013 at 05:44:11PM +0100, Tom Ellis wrote:
> On Thu, Aug 08, 2013 at 06:25:12PM +0200, Daniel Trstenjak wrote:
> > > See [1] for an explanation of free monads in general.  For IO in 
> > > particular,
> > > define a functor
> > > 
> > >     data IOF a = GetChar (Char -> a) | PutChar Char a | ...
> > > 
> > > with constructors for all elementary IO operations.
> > 
> > But how should this work if the user adds an IO operation, e.g by wrapping 
> > a C function?
> 
> Wrapping a C function could perhaps be provided by something like
> 
>     data IOF a = ... | forall i o. Foreign String i (o -> a) | ...
> 
>     csin :: Double -> IO Double
>     csin x = liftF (Foreign "math.h sin" x id)

I suppose that should actually be 'csin :: CDouble -> IO CDouble', but
hopefully the general method is clear.

Tom


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

Reply via email to