Re: [Haskell-beginners] Monadic functions definitions for free monadic DSL

I would really like to help you, but without your imports, packages, etc, it is really hard to interpret your program. Like where does decodeUtf8 come from, or receive, or TCPSocket? If they are functions you wrote, I don't need their code, the types would be sufficient.
Imports are: import Protolude import Control.Monad.Free import System.Socket import System.Socket.Family.Inet import System.Socket.Type.Stream import System.Socket.Protocol.TCP import Control.Exception ( bracket, catch ) import Data.ByteString as BS (uncons) decodeUtf8 :: ByteString -> Text encodeUtf8 :: Text -> ByteString I'm using the socket library for the actual networking (https://hackage.haskell.org/package/socket-0.6.0.1) type TCPSocket = Socket Inet Stream TCP receive :: Socket f t p -> Int -> MessageFlags -> IO ByteString Source send :: Socket f t p -> ByteString -> MessageFlags -> IO Int accept :: (Family f, Storable (SocketAddress f)) => Socket f t p -> IO (Socket f t p, SocketAddress f) If it helps the full source is at https://bitbucket.org/sumitraja/network-free/src/a4fcbc74c9e178e81d8b10b60d9.... Looking forward to your assistance. Thanks Sumit

Dear Sumit,
You are right that there's something's fishy about the free monadic
modeling of accept.
The following parallel construction will prove instructive:
The native effect:
send :: chan -> ByteString -> IO Bool
is modeled in the free monad by the constructor for the base functor
Send :: chan -> ByteString -> (Bool -> next) -> NetworkActivity chan next
which is the data wrapping used in the value level
sendit :: chan -> ByteString -> Free (NetworkActivity chan) Bool
sendit chan buf = liftF (Send chan buf identity)
Analogously, the native
accept :: chan -> IO chan
is modeled by
Accept :: chan -> (chan -> next) -> NetworkActivity chan next
used in
acc :: chan -> Free (NetworkActivity chan) chan
acc chan = liftF (Accept chan identity)
Except that you used a different constructor for the base functor. Not
Accept :: chan -> (chan -> next) -> NetworkActivity chan next
but
Accept :: chan -> next -> (chan -> next) -> NetworkActivity chan next
which is equivalent to
Accept :: chan -> (Maybe chan -> next) -> NetworkActivity chan next
The new free monadic term that substitutes for the native accept is the
same like before
acc chan = liftF (Accept chan identity)
only with a different type
acc :: chan -> Free (NetworkActivity chan) (Maybe chan)
modeling a native
accept :: chan -> IO (Maybe chan)
Given a native API, its free monad encoding is entirely boilerplate. I
wrote about the boilerplate process here (skip the sections that don't
concern you):
http://www.atamo.com/articles/free-monads-wont-detox-your-colon/
Best, Kim-Ee
-- Kim-Ee
On Fri, Oct 14, 2016 at 6:44 AM, Sumit Raja
I would really like to help you, but without your imports, packages, etc, it is really hard to interpret your program. Like where does decodeUtf8 come from, or receive, or TCPSocket? If they are functions you wrote, I don't need their code, the types would be sufficient.
Imports are:
import Protolude import Control.Monad.Free import System.Socket import System.Socket.Family.Inet import System.Socket.Type.Stream import System.Socket.Protocol.TCP import Control.Exception ( bracket, catch ) import Data.ByteString as BS (uncons)
decodeUtf8 :: ByteString -> Text encodeUtf8 :: Text -> ByteString
I'm using the socket library for the actual networking (https://hackage.haskell.org/package/socket-0.6.0.1)
type TCPSocket = Socket Inet Stream TCP receive :: Socket f t p -> Int -> MessageFlags -> IO ByteString Source send :: Socket f t p -> ByteString -> MessageFlags -> IO Int accept :: (Family f, Storable (SocketAddress f)) => Socket f t p -> IO (Socket f t p, SocketAddress f)
If it helps the full source is at https://bitbucket.org/sumitraja/network-free/src/ a4fcbc74c9e178e81d8b10b60d912b32c542b661/src/Lib.hs.
Looking forward to your assistance.
Thanks
Sumit _______________________________________________ Beginners mailing list Beginners@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
participants (2)
-
Kim-Ee Yeoh
-
Sumit Raja