gpt4 book ai didi

scala - State monad 在具有可变(本地)变量的语言(例如 Scala)中是否需要/有用?

转载 作者:行者123 更新时间:2023-12-03 03:33:19 24 4
gpt4 key购买 nike

我知道在 Haskell 中 State monad 很有用,因为没有可变变量(除非我们在 IO monad 中)。

但是,Scala 是怎么回事? State Monad 在存在可变变量的语言中有用吗?

从某种意义上说,State Monad 所允许的就是 use some local mutable variables within the Monad context 。例如这里:

 newtype Labeled anytype = Labeled (S -> (S, anytype))

instance Monad Labeled where

return contents = Labeled (\st -> (st, contents))

Labeled fst0 >>= fany1 =
Labeled $ \st0 ->
let (st1, any1) = fst0 st0
Labeled fst1 = fany1 any1
in fst1 st1

mlabel :: Tr anytype -> Lt anytype
mlabel tr = let Labeled mt = mkm tr
in snd (mt 0)

mkm :: Tr anytype -> Labeled (Lt anytype)

mkm (Lf x)
= updateState >>= \n -> return $ Lf (n,x)

mkm (Br l r)
= mkm l >>= \l' ->
mkm r >>= \r' ->
return $ (Br l' r')

updateState :: Labeled S
updateState = Labeled (\n -> ((n+1),n))

main = print $ mlabel tr1

使用 Scala 中的可变变量,此代码会简单得多(3-4 行)。就像是:案例类 Tr (...)

案例类 LTr (...)

def labelTree = (...递归调用...)

其中 labelTree 使用本地可变变量来存储标签的当前状态。

我并没有真正看到 Scala 中 State Monad 的用处。为什么有人会在 Scala 中使用 State Monad ?它有什么好的用例吗?

如果状态计算很复杂并且由多个 State Monad 组成,这是我能想象的唯一用例,但此时我不确定使用 State Monad 与普通的旧函数式编程和显式参数相比有多大用处传递(而不是隐式参数传递,这就是 State Monad)。

最佳答案

在 Haskell 中编写有状态操作时,有一个习惯用法,即操作只需要知道完成其任务所需的最低限度的状态,然后每个操作都是 zoomed进入一个复合的“全局状态”。例如:

import Control.Lens
import Control.Monad.Trans.State

succInt :: StateT Int IO String
succInt = do
modify succ
return "Incr an Int!"

succChar :: StateT Char IO String
succChar = do
modify succ
return "Incr a Char!"

type GlobalState = (Char,[Int])

composite :: StateT GlobalState IO (String,String)
composite = do
r1 <- zoom _1 succChar
r2 <- zoom (_2.traversed) succInt
return (r1,r2)

如果我们像这样执行示例:

ghci> runStateT composite ('a',[1,5,7])

结果是

(("Incr a Char!","Incr an Int!Incr an Int!Incr an Int!"),('b',[2,6,8]))

我认为使用可变变量将状态“缩放”为更大的状态会更困难。

关于scala - State monad 在具有可变(本地)变量的语言(例如 Scala)中是否需要/有用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43230520/

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