2017-04-26 1 views
0

나는 한 줄짜리 텍스트 편집기를 만들려고하는 프로그램이있다. 나는이 시점에서 조금 벽에왔다. listleft이고, 하나는 right 입니다. 함수 또는 할 일 목록에서 왼쪽으로 설정할 수 있습니다. left ++ char 여기서 char은 사용자가 입력 한 char입니다. 목록을 수정할 수는 없지만이를 재정의 할 수 있습니까? 이 의사 코드 사전동일한 변수에 변수를 설정하면 수정됩니까?

이것은 State Monad가 무엇인지입니다
+3

예, 그렇습니다. "그림자"할 수 있습니다. 그러나 새 바인딩이 이전 바인딩과 완전히 별개의 것처럼 보일 것입니다. 새 정의에 다른 이름을 사용하는 것만으로는 할 수없는 섀도 잉 작업으로는 아무 것도 할 수 없습니다. – luqui

+0

"수정"과 "재정의"의 차이점은 무엇입니까? 변수가 값에 바인딩되면 더 이상 변경할 수 없습니다. 그러나 새 변수를 새로운 값으로 정의 할 수 있습니다. 새 변수는 이전 변수와 동일한 이름을 가질 수도 있지만 여전히 새로운 변수입니다. – chi

+0

음,'let left = "new"+ "value"'와 같이'left'를 음영 처리 할 수 ​​있지만'let left = left ++ in'은'left'의 재귀 적 정의를 만듭니다; 값이'left'의 이전 값과'in'을 결합한 새로운'left'를 생성하지 않습니다. – chepner

답변

2

에서

left = "hello" 
in = get user input 
left = left ++ in 

감사합니다 도움이된다면. 링크가 도움이 될 것입니다 (튜토리얼을 가리킴). 귀하의 예는 다음과 같습니다 :

type Line = State String() 
addInput :: String -> Line 
addInput inp = do 
    left <- get 
    put $ left ++ inp 
runState (addInput <user input>) "hello" 

그러나 이것은 약간의 모나드를 알아야합니다. 링크의 예를 따르십시오.

+0

addInput inp = modify (++ inp)'로 단축 할 수 있다고 언급했습니다. – leftaroundabout

관련 문제