Haskell 一元API,带;背面窗格“;价值观

Haskell 一元API,带;背面窗格“;价值观,haskell,monads,api-design,clash,Haskell,Monads,Api Design,Clash,我正在创建一个库,用于描述地址行与内存元素的连接。我认为一元API可以很好地用于创建组件(具有标识,以支持镜像),然后在各种受限地址范围内使用这些组件句柄;e、 g: (dataIn, ()) = memoryMap _addrOut _dataOut $ do rom <- romFromFile (SNat @0x2000) "SpaceInvaders.bin" ram <- ram0 (SNat @0x0400) from 0x0

我正在创建一个库,用于描述地址行与内存元素的连接。我认为一元API可以很好地用于创建组件(具有标识,以支持镜像),然后在各种受限地址范围内使用这些组件句柄;e、 g:

(dataIn, ()) = memoryMap _addrOut _dataOut $ do
    rom <- romFromFile (SNat @0x2000) "SpaceInvaders.bin"
    ram <- ram0 (SNat @0x0400)

    from 0x0000 $ connect rom
    from 0x2000 $ connect ram
    from 0x4000 $ connect ram
(dataIn,())=memoryMap\u addrOut\u dataOut$do

rom而不是索引的monad,也许您可以使用由名称/类型的类型级列表参数化的monad。(可能需要用户提供类型签名或类型应用程序。)monad将携带某种由列表索引的可扩展记录作为状态。创建“backpane连接”的命令需要一个具有特定端口名称(或索引)的类型应用程序。但这并不能强制类型级别列表中提到的所有端口都给定值。如果有意义的话,也许缺失的端口可以被赋予某种“中性”值。
(dataIn, outByte) = memoryMap _addrOut _dataOut $ do
    rom <- romFromFile (SNat @0x0800) "_build/intel8080/image.bin"
    ram <- ram0 (SNat @0x1800)
    (acia, outByte) <- port $ acia inByte outReady

    matchLeft $ do
        from 0x10 $ connect acia
    matchRight $ do
        from 0x0000 $ connect rom
        from 0x0800 $ connect ram

    return outByte