2013-04-18 2 views
1

실행 원래 배열 arr '을 쌍 (res, arr')으로 사용합니다.는 Haskell- 내가이 기능을 얻으려고 노력 붙어 모나드 상태

ArrayState이

data ArrayState arr e a = MkArrayState (arr e -> (a, arr e)) 

으로 정의 내가 생각했던 :

runArrayState act arr = ((act arr), arr) 

또는

runArrayState MkArrayState (\ arr -> (res, arr)) arr' = (res, arr') 

하지만 모두 실패합니다. 어떤 아이디어?

+0

'ArrayState'는 하나의 인수를 가진 하나의 생성자만을 가지고 있습니다. 거의 모든 상황에서 대신'newtype'을 사용해야합니다. – luqui

+1

어쨌든,이 관용적 인 스타일로'ArrayState'를 정의하면'runArrayState'를 무료로 얻을 수 있습니다 :'newtype ArrayState arr e a = MkArrayState {runArrayState :: arr e -> (a, arr e)}' – luqui

답변

3

나는

runArrayState (MkArrayState act) arr = act arr 

당신이 찾고있는 생각합니다.

유형 ArrayState은 하나의 생성자 MkArrayState을 갖는 것으로 정의됩니다.이 인수는 결과와 (아마도) 업데이트 된 배열로 구성된 쌍으로 배열을 사용하는 인수를가집니다. 위의 정의에서 우리는 식별자 act을 사용하여이 함수를 참조하고 입력으로 배열에 arr을 사용합니다. 정의의 오른쪽에서 함수 actarr에 적용하여 필요한 쌍을 얻습니다.

또는, 당신은 더 나은 심지어

newtype ArrayState arr e a = MkArrayState {runArrayState :: arr e -> (a, arr e)} 

그 방법을 (대부분)

data ArrayState arr e a = MkArrayState {runArrayState :: arr e -> (a, arr e)} 

로 유형을 정의하거나 할 수 있습니다 (직접이 유형 ArrayState arr e a -> arr e -> (a, arr e)의 소멸자 함수를 정의합니다 즉, 위의 버전에서 필요하지 않은 클래스 제약 조건없이).

관련 문제