【问题标题】:Manipulating Haskell Monad State操纵 Haskell Monad 状态
【发布时间】:2019-03-02 13:28:20
【问题描述】:

有点类似于this question,我想弄清楚 如何在 Haskell Monad 状态下移动。 团队中的每个Employee 都替换为对应的Employee' 同时保持一些简单的状态。代码如下:

module Main( main ) where
import Control.Monad.State

data Employee  = EmployeeSW  Int Int | EmployeeHW Int String deriving ( Show )
data Employee' = EmployeeSW'     Int | EmployeeHW'    String deriving ( Show )

scanTeam :: [Employee] -> State (Int,Int) [Employee']
scanTeam [    ] = return []
scanTeam (p:ps) = scanEmployee p -- : scanTeam ps ???

scanEmployee :: Employee -> State (Int,Int) Employee'
scanEmployee (EmployeeSW id s) = do
    (num,raise) <- get
    put (num+1,raise)
    return (EmployeeSW' (s+raise))
scanEmployee (EmployeeHW id s) = do
    (num,raise) <- get
    put (num+1,raise)
    return (EmployeeHW' (s++(show raise)))

startState = (0,3000)

t = [(EmployeeHW 77 "Hundred"),(EmployeeSW 66 500),(EmployeeSW 32 200)]

main = print $ evalState (scanTeam t) startState

我想最终将scanEmployee pscanTeam ps 连接起来, 所以我试图提取scanEmployee p 的碎片并以某种方式粘合 他们和scanTeam ps一起。到目前为止,我失败得很惨。 实际上,我什至不确定状态是否可以在它们之间移动(?)。

【问题讨论】:

    标签: haskell monads


    【解决方案1】:

    由于State 是一个单子,您可以使用do 符号来定义State 计算。 (StateMonad 实例将状态贯穿,因此 do 块中一个语句的结束状态成为下一个语句的开始状态。)

    所以,在do 块中,我将:

    1. 处理列表中的第一个Employee 以获得新的Employee
    2. 递归处理列表的其余部分
    3. 将两个结果重新组合在一起,并将它们用作Stateful 计算的返回值。
    scanTeam :: [Employee] -> State (Int,Int) [Employee']
    scanTeam [    ] = return []
    scanTeam (p:ps) = do
        newP <- scanEmployee p
        newPs <- scanTeam ps
        return (newP:newPs)
    

    事实证明,“map in a monadic context”通常非常有用,所以它在标准前奏曲中以mapM :: Monad m =&gt; (a -&gt; m b) -&gt; [a] -&gt; m [b](又名traverse :: (Traversable t, Applicative f) =&gt; (a -&gt; f b) -&gt; t a -&gt; f (t b),如果你准备好进入兔子洞)的形式出现)。

    scanTeam = mapM scanEmployee
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-29
      • 1970-01-01
      • 2021-03-22
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      • 2021-10-22
      • 1970-01-01
      相关资源
      最近更新 更多