Haskell 如何使用状态单子重构代码,通过添加更多函数来增加模块性?

Haskell 如何使用状态单子重构代码,通过添加更多函数来增加模块性?,haskell,monads,record,clash,Haskell,Monads,Record,Clash,我正在努力掌握单子的诀窍。我想和州单子一起玩是个好习惯 从以下位置使用UART接收: 我认为有一个功能 我错过了 我想做点像 newFun = when (not _rx_busy && _rx_d2 == 0) $ do rx_busy .= True rx_sample_cnt .= 1 rx_cnt .= 0 我想我需要一个类似于execState的函数 所以我的问题是 我应该用什么 该函数

我正在努力掌握单子的诀窍。我想和州单子一起玩是个好习惯

从以下位置使用UART接收:

我认为有一个功能

我错过了

我想做点像

newFun = when (not _rx_busy && _rx_d2 == 0) $ do
         rx_busy       .= True
         rx_sample_cnt .= 1
         rx_cnt        .= 0
我想我需要一个类似于
execState
的函数

所以我的问题是

  • 我应该用什么
  • 该函数做了什么,允许它与其他函数组合
  • 如果monad只是在编写,为什么我不能在没有execState类型函数的函数中使用
    when
  • 我还可以用什么方法来提高代码的模块化程度
      在您对
      newFun

      newFun = when (not _rx_busy && _rx_d2 == 0) $ do
               rx_busy       .= True
               rx_sample_cnt .= 1
               rx_cnt        .= 0
      
      您正试图引用
      \u rx\u busy
      \u rx\u d2
      ,它们是
      RxReg
      类型的记录字段。在
      uartRX
      中,第一个参数是
      RxReg
      ,RecordWildCards语言扩展用于通过将参数与模式
      RxReg{..}
      匹配来绑定所有字段名。因此,您需要将
      r
      本身传递,或者至少将
      \u rx\u busy
      \u rx\u d2
      uartRX
      传递到
      newFun
      ;i、 要么有

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


      在您对
      newFun

      newFun = when (not _rx_busy && _rx_d2 == 0) $ do
               rx_busy       .= True
               rx_sample_cnt .= 1
               rx_cnt        .= 0
      
      您正试图引用
      \u rx\u busy
      \u rx\u d2
      ,它们是
      RxReg
      类型的记录字段。在
      uartRX
      中,第一个参数是
      RxReg
      ,RecordWildCards语言扩展用于通过将参数与模式
      RxReg{..}
      匹配来绑定所有字段名。因此,您需要将
      r
      本身传递,或者至少将
      \u rx\u busy
      \u rx\u d2
      uartRX
      传递到
      newFun
      ;i、 要么有

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

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