[Haskell-cafe] "Hey! Monad! Leave my Pure alone!"

Georgi Lyubenov godzbanebane at gmail.com
Wed Apr 26 06:49:00 UTC 2023


Hey Scott

How should the result of `Vector wordType` in the "pure" variant of the 
function you want to implement be produced? Is that expected to come 
from user input?

Cheers,
Georgi

On 4/26/23 00:32, Scott Michel wrote:
> For a number of years, I've been hacking on a Z80 processor simulator, 
> on and off. It's generally pure code that resembles and uses State, 
> et. al. The design issue I've run into is adding devices to the memory 
> system, unsurprisingly typed as MemorySystem. Devices like to do I/O, 
> which potentially "pollutes" a design with Monads. So... I'm 
> soliciting suggestions that allow me to isolate Monadic code in the 
> middle of pure code (which might be Quixotic, but I'll accept that risk.)
>
> MemorySystem uses interval maps containing memory regions, and a 
> memory region can be a RAMRegion, ROMRegion or DeviceRegion. The 
> abbreviated data declarations are:
>
> type MemRegionMap addrType wordType = IM.IntervalMap addrType 
> (MemoryRegion addrType wordType)
> data MemorySystem addrType wordType where
>   MSys ::
>     { _regions    :: MemRegionMap addrType wordType
>   } -> MemorySystem addrType wordType
> data MemoryRegion addrType wordType where
>   EmptyRegion :: MemoryRegion addrType wordType
>   RAMRegion :: {- ... -}
>   ROMRegion :: {- ... -}
>   DevRegion :: {- ... -}
> RAMRegion-s and ROMRegion-s are unboxed vector containers, which makes 
> reading and writing to them pure State code, i.e., the last two 
> function arguments to the reading function are "MemorySystem ... -> 
> (Vector wordType, MemorySystem ...)", viz:
> type MemReadN addrType wordType = (Vector wordType, MemorySystem 
> addrType wordType)
> mReadN :: addrType
>        -- ^ Starting address
>        -> Int
>        -- ^ Number of words to read
>        -> MemorySystem addrType wordType
>        -- ^ The memory system from which to read
>        -> MemReadN addrType wordType
> Supporting DevRegion-s gets more complicated, because I/O is involved 
> (we like consoles on our machines, yes, we do.) I'd like to keep the 
> reader signature without unnecessarily injecting a Monad or Monad 
> Transformer into MemoryRegion and MemorySystem, thereby keeping the 
> Monad or transformer isolated in DevRegion. For example, an internal 
> device reader  function would have a signature similar to "... -> 
> Device m devType -> (Vector wordType, m devType)" instead of "... -> 
> Device m devType -> m (Vector WordType, devType)", where "m" is the 
> Monad or transformer.
> I know, it's hard to jailbreak things out of a Monad, which may be 
> answering my own question. However, it seems to me that this kind of 
> problem occurs in real world Haskell, and I haven't encountered the 
> real world solution.
> Ideas?
> -scooter
>
> _______________________________________________
> Haskell-Cafe mailing list
> To (un)subscribe, modify options or view archives go to:
> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
> Only members subscribed via the mailman list are allowed to post.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20230426/fc0ddb84/attachment.html>


More information about the Haskell-Cafe mailing list