gpt4 book ai didi

haskell - 链接状态 Monad

转载 作者:行者123 更新时间:2023-12-05 02:18:22 26 4
gpt4 key购买 nike

我有一个函数

step :: Int -> State Int Int
step n = get >>= \x -> put (x `div` n) >> return (x `mod` n)

λ> runState (step 25) 41
(16,1)

如何使用不同的 n 值运行一系列 step,并且每个步骤都使用上一步的状态?

例如,步骤如下

第一步产生 (16,1) 然后我想将其用作下一步的输入 n = 10 应该产生 (6, 2)。第一步中的 1 被添加到,第一步中的 16 被新的 n 修改。

n = 25 gives (16,1) then
n = 10 gives (6,2) then
n = 5 gives (1,3) then
n = 1 gives (0,4)

我知道在这里使用 State 可能不正确;但我正在尝试将其作为一种学习方式。

可能的目标是用状态 monad 来实现这个功能。

greedy :: Double -> Int
greedy owed = snd $ foldl go (pennies,0) [25, 10, 5, 1]
where
pennies = floor . (*100) $ owed
go (remaining,counter) coin = (remaining',counter')
where
remaining' = remaining `mod` coin
counter' = counter + remaining `div` coin

最佳答案

函数,

mapM step [25,10,5,1]

或更一般的

traverse step [25,10,5,1]

[25,10,5,1] 的每个列表上运行 step。调用

runState  (mapM step [25,10,5,1]) 41

运行初始状态设置为 41 的函数,返回步骤输出列表和最终状态。

([16,1,0,0],0)

如果您想将状态与输出一起列出,只需修改 step 以包含它们。

step n = get >>= \x ->  put  (x `div` n) >> return ((x `mod` n),(x `div` n))

换句话说

step n = do 
x <- get
let (r,x') = (x `mod` n,x `div` n)
put x'
return (r,x')

结果是,([(16,1),(1,0),(0,0),(0,0)],0),仍然不是你想要的对于,但更接近。恐怕我不太了解你的方程式的细节,无法得到你正在寻找的东西,但这应该有助于理清状态部分,让你专注于数学。

让上面的go函数:

go n = do
(r,c) <- get
let (r',c') = (r `mod` n, c + (r `div` n))
put (r',c')
return (r',c')

runState (mapM go [25,10,5,1]) (41,0)

产量,

([(16,1),(6,2),(1,3),(0,4)],(0,4))

希望对你有帮助

关于haskell - 链接状态 Monad,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45435845/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com