2010-04-04 4 views
12

저는 Real World Haskell의 Monads 장을 읽었습니다 (14 장).MonadState를 설치 한 이유는 무엇입니까?

type RandomState a = State StdGen a 
getRandom :: Random a => RandomState a 
getRandom = 
    get >>= \gen -> 
    let (val, gen')= random gen in 
    put gen' >> 
    return val 

난 정말 GET의 목적을 이해하고 여기에 기능을 넣어하지 않는 다음과 같이 함수는 defined입니다.

getRandom2 :: Random a => RandomState a 
getRandom2= State $ \ s -> random s 

그래서 제 질문은 다음과 같습니다 : 및 일반에 넣어 얻을의 목적은 무엇 나는 같은 일을하는 것보다 간결 다음과 같은 기능을 다시 썼다?

+1

이 경우, 또는 일반적으로'get' 및'put'의 목적은 무엇입니까? 그들의 사용은 후자의 경우에 더 쉽게 설명 될 수 있습니다 ... – kennytm

+0

일반적으로; 내 질문을 수정하겠습니다. – CiscoIPPhone

답변

12

그건 random가 (실제로이 경우에는 더욱 간결, 아마 더 혼란스러운 경우가 될 수있는 State 모나드의 내부 함수와 완전히 동일한 유형의 서명/사용 패턴을 가지고 발생하는 우연의 비트, getRandom2 = State random).

그러나 더 일반적으로는 적용되지 않으며 getput은 내부 함수를 직접 작성하는 것보다 의미가 명확한 편리한 배관 부품입니다. 그들은 또한 State에 의해 사용 된 정확한 표현에서 추상화하는 데 도움이됩니다. 실제로는보다 일반적인 클래스 MonadState의 클래스 구성원이므로이를 사용하여 더 많은 다형성 코드를 작성할 수 있습니다.

+0

또 하나의 질문이 있습니다 - 어떻게 다음 전화를 걸 때 * 새로운 상태를 유지합니까? * put *의 출력은 무시됩니다. 알아낼 수 없습니다. 제발 도와주세요. 고마워. –

+0

그것은'State' 모나드의 내부 배관의 일부입니다. 'put '의 모나드 출력은 유용한 값이 아님을 나타 내기 위해'()'유형입니다. –

+0

답장을위한 Thx. 그러나 나는 완전히 이해하지 못합니다. * put *에 부작용이 있습니까? 새로운 주를 어떻게 저장하는지 설명 할 수 있습니까? 고마워. –

관련 문제