하스켈에서 상태 모나드는 유용 할 수 있습니다. 왜냐하면 우리가 IO 모나드에 있지 않는 한 가변 변수가 없기 때문입니다.스테이트 모나드는 변경 가능 (지역 변수)이있는 언어 (예 : Scala)에서 필요/유용합니까?
그러나 스칼라와 어떤 관계가 있습니까? State Monad는 가변 변수가있는 언어에서 유용합니까?
어떤 의미에서는 모든 주 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
이 코드는 스칼라에서 가변 변수를 사용하면 훨씬 간단합니다 (3-4 줄). 비슷해 :
def labelTree = (... recursive call ...)
case class Tr (...)
case class LTr (...)
labelTree
라벨의 현재 상태를 저장하는 가변 로컬 변수를 사용한다.
저는 스칼라에서 State Monads의 유용성을 실제로 볼 수 없습니다. 왜 스칼라에서 State Monad를 사용합니까? 거기에 좋은 유스 케이스가 있습니까?
stateful 계산이 복잡하고 여러 State Monads로 구성되어있는 경우를 상상할 수있는 유일한 유스 케이스이지만 일반적인 모범 함수 프로그래밍과는 달리 상태 모나드를 사용하는 것이 얼마나 유용한 지 잘 모르겠습니다. 인수 전달 (State Monad의 암시 적 인수 전달 대신).
이것은 아마도 의견의 문제 일 것입니다. 그러나 생각을위한 음식 : 하스켈은 가변 참조 (IORef, STRef 등)를 할 수 있으므로 스칼라에서 주를 사용하지 않는 이유는 하스켈에게도 마찬가지로 유효합니다. 왜 하스켈러는 국가를 사용합니까? – user2297560
변경 가능성이있는 언어에서는 그리 유용하지 않다고 생각합니다. 어쩌면 하나의 상태 모나드를 사용하여 특정 서브 루틴이 몇 가지 변수의 상태 만 변이하지만 나머지는 그대로 둡니다. 아마도 상태 모나드가 함수로 구현 된 경우에는 특히 노력이 필요하지 않으므로 일반 변경 가능 변수보다 효율적이지 않습니다 (적어도 최적화가없는 경우). – chi
@ user2297560 어쩌면 그들은 IO Monad에 머물고 싶지 않을 것입니다. 어떤 이유로? – jhegedus