如何使用State monad重构代码,以通过添加更多功能来增加模块化?

error_null_pointer

我试图摆脱单子的困扰。我认为和州立单子一起玩是个好习惯。

使用CLaSH的UART Rx

-- UART RX Logic
data RxReg
  = RxReg
  { _rx_reg        :: BitVector 8
  , _rx_data       :: BitVector 8
  , _rx_sample_cnt :: Unsigned 4
  , _rx_cnt        :: Unsigned 4
  , _rx_frame_err  :: Bool
  , _rx_over_run   :: Bool
  , _rx_empty      :: Bool
  , _rx_d1         :: Bit
  , _rx_d2         :: Bit
  , _rx_busy       :: Bool
  }

makeLenses ''RxReg

uartRX r@(RxReg {..}) rx_in uld_rx_data rx_enable = flip execState r $ do
  -- Synchronise the async signal
  rx_d1 .= rx_in
  rx_d2 .= _rx_d1
  -- Uload the rx data
  when uld_rx_data $ do
    rx_data  .= _rx_reg
    rx_empty .= True
  -- Receive data only when rx is enabled
  if rx_enable then do
    -- Check if just received start of frame
    when (not _rx_busy && _rx_d2 == 0) $ do
      rx_busy       .= True
      rx_sample_cnt .= 1
      rx_cnt        .= 0
    -- Star of frame detected, Proceed with rest of data
    when _rx_busy $ do
      rx_sample_cnt += 1
      -- Logic to sample at middle of data
      when (_rx_sample_cnt == 7) $ do
        if _rx_d1 == 1 && _rx_cnt == 0 then
          rx_busy .= False
        else do
          rx_cnt += 1
          -- start storing the rx data
          when (_rx_cnt > 0 && _rx_cnt < 9) $ do
            rx_reg %= replaceBit (_rx_cnt - 1) _rx_d2
          when (_rx_cnt == 9) $ do
            rx_busy .= False
            -- Check if End of frame received correctly
            if _rx_d2 == 0 then
              rx_frame_err .= True
            else do
              rx_empty     .= False
              rx_frame_err .= False
              -- Check if last rx data was not unloaded
              rx_over_run  .= not _rx_empty
  else do
    rx_busy .= False

我将如何将when逻辑移至自己的功能?我已经玩了一点,但是镜头似乎引起了问题。

Could not deduce Control.Monad.State.Class.MonadState from .=

我觉得有一个函数在这里

我很想念。

我想做类似的事情

newFun = when (not _rx_busy && _rx_d2 == 0) $ do
         rx_busy       .= True
         rx_sample_cnt .= 1
         rx_cnt        .= 0

我想会有一个execState我需要的功能

所以我的问题是

  • 我应该使用什么?
  • 该功能有哪些功能使其可以与其他功能组合?
  • 如果单子组成,为什么不能when在没有execState类型函数的函数中使用?
  • 我还可以通过哪些其他方式来提高此代码的模块化程度?
仙人掌

在你的定义 newFun

newFun = when (not _rx_busy && _rx_d2 == 0) $ do
         rx_busy       .= True
         rx_sample_cnt .= 1
         rx_cnt        .= 0

您正在尝试引用_rx_busy_rx_d2,它们是类型的记录字段RxReg在中uartRX,第一个参数是an RxReg,并且RecordWildCards语言扩展用于通过将参数与模式匹配来绑定所有字段名称RxReg{..}因此,您要么需要将r自身传递,要么至少将_rx_busyand和_rx_d2fromuartRX传递给newFun即要么有

newFun busy d2 = when (not busy && d2 == 0) $ do
    ...

或者

newFun RxReg{..} = when (not _rx_busy && _rx_d2 == 0) $ do
    ...

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用 State Monad

来自分类Dev

我该如何添加更多功能?并设置 在Xamarin表单中,通过删除“ =>”并用每个代码块替换?

来自分类Dev

如何重构此Javascript代码,使其更加模块化和简洁?

来自分类Dev

如何模块化角度代码?

来自分类Dev

如何在单个按钮中添加更多功能

来自分类Dev

Wordpress PHP 如何使用 AJAX/JQUERY 添加加载更多功能

来自分类Dev

如何在模块化设计模式中嵌套功能?

来自分类Dev

如何在模块化设计模式中嵌套功能?

来自分类Dev

如何在Node JS中模块化代码

来自分类Dev

我想使用 javascript 模块化代码

来自分类Dev

如何使用EnvironmentObject在SwiftUI中初始化State属性?

来自分类Dev

如何通过添加功能来扩展对象,然后使用self访问原始对象?

来自分类Dev

使用相同的模板执行更多功能

来自分类Dev

使用相同的模板执行更多功能

来自分类Dev

您如何利用Swift功能来重构此递归函数?

来自分类Dev

我可以使用jQuery Mobile导航模型页面(data-role ='page')通过将页面拆分为不同的文件来对代码进行模块化吗?

来自分类Dev

如何使用Node.js Express模块化路由

来自分类Dev

如何在索引上使用模块化算术?

来自分类Dev

如何制作和使用LinearLayout的模块化xml文件

来自分类Dev

如何在棱镜WPF模块化应用程序中首先使用代码动态创建数据库表?

来自分类Dev

如何在棱镜WPF模块化应用程序中首先使用代码动态创建数据库表?

来自分类Dev

MySQL:如何获取视图的模块化,但如何优化较长的代码?

来自分类Dev

使用State Monad插入树

来自分类Dev

将此代码重构为模块化的内容

来自分类Dev

sympy lambdify:如何提供更多功能(NCDF,NPDF等)

来自分类Dev

sympy lambdify:如何提供更多功能(NCDF,NPDF等)

来自分类Dev

在数组的空索引处插入值。如何编写更短或更模块化的代码?

来自分类Dev

如何将requirejs用于将该代码段模块化?

来自分类Dev

Ember应用程序间歇性工作-使用requirejs进行模块化代码

Related 相关文章

  1. 1

    如何使用 State Monad

  2. 2

    我该如何添加更多功能?并设置 在Xamarin表单中,通过删除“ =>”并用每个代码块替换?

  3. 3

    如何重构此Javascript代码,使其更加模块化和简洁?

  4. 4

    如何模块化角度代码?

  5. 5

    如何在单个按钮中添加更多功能

  6. 6

    Wordpress PHP 如何使用 AJAX/JQUERY 添加加载更多功能

  7. 7

    如何在模块化设计模式中嵌套功能?

  8. 8

    如何在模块化设计模式中嵌套功能?

  9. 9

    如何在Node JS中模块化代码

  10. 10

    我想使用 javascript 模块化代码

  11. 11

    如何使用EnvironmentObject在SwiftUI中初始化State属性?

  12. 12

    如何通过添加功能来扩展对象,然后使用self访问原始对象?

  13. 13

    使用相同的模板执行更多功能

  14. 14

    使用相同的模板执行更多功能

  15. 15

    您如何利用Swift功能来重构此递归函数?

  16. 16

    我可以使用jQuery Mobile导航模型页面(data-role ='page')通过将页面拆分为不同的文件来对代码进行模块化吗?

  17. 17

    如何使用Node.js Express模块化路由

  18. 18

    如何在索引上使用模块化算术?

  19. 19

    如何制作和使用LinearLayout的模块化xml文件

  20. 20

    如何在棱镜WPF模块化应用程序中首先使用代码动态创建数据库表?

  21. 21

    如何在棱镜WPF模块化应用程序中首先使用代码动态创建数据库表?

  22. 22

    MySQL:如何获取视图的模块化,但如何优化较长的代码?

  23. 23

    使用State Monad插入树

  24. 24

    将此代码重构为模块化的内容

  25. 25

    sympy lambdify:如何提供更多功能(NCDF,NPDF等)

  26. 26

    sympy lambdify:如何提供更多功能(NCDF,NPDF等)

  27. 27

    在数组的空索引处插入值。如何编写更短或更模块化的代码?

  28. 28

    如何将requirejs用于将该代码段模块化?

  29. 29

    Ember应用程序间歇性工作-使用requirejs进行模块化代码

热门标签

归档