gpt4 book ai didi

haskell - 更严格的状态单子(monad)

转载 作者:行者123 更新时间:2023-12-03 23:54:51 25 4
gpt4 key购买 nike

严格的状态 monad 使用以下方式定义:

m >>= k = State $ \s ->
case runState m s of
(a, s') -> runState (k a) s'

但这仍然会泄漏内存,因为 as'未评估。例如,我们可能有一个函数 f将大对象作为输入并快速返回 (a, s') , 但只要 a未评估 f 的输入不能被 GC 处理。

一种可能的解决方案是使用 f返回 seq a (a, s') ,但如果我们使用像 MonadRandom 这样的东西,这并不总是可能的。 ,并且状态被封装远离 f .是否有这样定义的版本:
m >>= k = State $ \s ->
case runState m s of
(!a, !s') -> runState (k a) s'

这是否已经存在于任何地方的图书馆中?

最佳答案

根据单子(monad)恒等律,

return a >>= const b = const b a = b

因此,特别是,
return undefined >>= const b = b

如果 >>=操作对结果值很严格,这会违反这个规律,所以你不应该这样做。

假设您改为这样做:
m >>= k = State $ \s ->
case runState m s of
(a, !s') -> runState (k a) s'

现在我们面临另一个身份定律:
m >>= return = m

例如,
return a >>= return = return a

所以如果 return a >>= return是严格的状态,那么我们也一定有 return a国家严格!所以我们需要重新定义 return还有:
return a = State $ \ !s -> (a, s)

请注意,您实际上并不需要这样做;如果你愿意,你可以使用通常的严格状态单子(monad),并编写类似的东西
!_ <- get

在你想要强制状态的地方。你甚至可以编写一个 Action 来做到这一点:
forceState :: Monad m => StateT s m ()
forceState = get >>= \ !_ -> return ()

编辑

甚至这个定义对我来说也有点奇怪。我希望 lambda 强制状态,而不是 case .我不确定不这样做是否会导致某种破损,但如果确实如此,我也不会感到惊讶。

关于haskell - 更严格的状态单子(monad),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28013499/

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