2012-05-04 7 views
17

나는 하스켈의스칼라 (다시 한번) 하스켈의 DO-표기법의 상당

do 
    x <- [1, 2, 3] 
    y <- [7, 8, 9] 
    let z = (x + y) 
    return z 

특히 모나드와,

for { 
    x <- List(1, 2, 3) 
    y <- List(7, 8, 9) 
    z = x + y 
} yield z 

로 스칼라로 표현 될 수 있지만은, 하스켈은 종종 내부 문을 가지고 있음을 알고 do 블록은 <- 또는 =에 해당하지 않습니다. 예를 들어 Parsec에서 파스 텍을 사용하여 문자열에서 파싱하는 코드가 있습니다.

당신이 볼 수 있듯이
-- | Parse contents of 'str' using 'parser' and return result. 
parseFromString :: GenParser tok st a -> [tok] -> GenParser tok st a 
parseFromString parser str = do 
    oldPos <- getPosition 
    oldInput <- getInput 
    setInput str 
    result <- parser 
    setInput oldInput 
    setPosition oldPos 
    return result 

, 그것은, 위치 및 입력을 저장하는 문자열에 대한 파서를 실행 한 다음 결과를 반환하기 전에 입력 및 위치를 복원합니다.

setInput str, setInput oldInputsetPosition oldPos을 스칼라로 번역하는 방법을 모르겠다. 난 그냥 내가 <-를 사용할 수에 말도 안되는 변수를 넣어 경우가

for { 
    oldPos <- getPosition 
    oldInput <- getInput 
    whyAmIHere <- setInput str 
    result <- parser 
    ... 
} yield result 

처럼 작동합니다하지만 난 그게 맞다면, 내가 거기에 있어야한다는 확신, 그런 경우 확실하지 않다 생각 이렇게하는 더 좋은 방법.

아,이 질문에 대답 할 수 있다면, 한 번 더 대답 해 주실 수 있습니까? 모나드를 까만 마술처럼 느끼지 않기까지 얼마나 오래 꼼짝 않고 바라 볼 수 있습니까? :-)

고마워요! 토드

+7

변수를 사용하지 않으려는 경우 이름을 밑줄로 바꿀 수 있습니다.'_ <- setInput str' – incrop

+0

가장 스칼라 식 방법입니다. – TOB

+0

정말로 가능할지 모르겠지만,이 문장을 for의 본문으로 옮겨 가면서 자연스럽게 보일 것입니다. 여기서 절차적인 스타일로 이동할 수 있습니다. – dividebyzero

답변

24

예, 해당 번역이 유효합니다.

do { x <- m; n }m >>= \x -> n과 같고, do { m; n }m >> n과 같습니다. m >> nm >>= \_ -> n (여기서 _은 "이 값을 다른 값에 바인딩하지 않음"을 의미 함)으로 정의됩니다. 실제로 유효한 번역입니다. do { m; n }do { _ <- m; n } 또는 do { unusedVariable <- m; n }과 같습니다.

do 블록에서 변수 바인딩이없는 문장은 대개 의미있는 결과가 없기 때문에 결과를 무시합니다. 예를 들어, putStrLn "Hello, world!"의 결과와 관련이 없기 때문에 결과를 변수에 바인딩하지 않을 것입니다.

(모나드가 흑 마술 인 것처럼 가장 좋은 실현은 실제로 복잡하지 않다는 것입니다. 더 깊은 의미를 찾으려는 시도는 일반적으로 어떻게 작동 하는지를 배우는 생산적인 방법이 아닙니다. 특별히 공통적으로 발생하는 계산을 구성하는 인터페이스 일뿐입니다. 하스켈의 추상적 인 타이프 클럭을 확실하게 이해하려면 Typeclassopedia을 읽는 것이 좋습니다.하지만 많은 부분을 이해하려면 일반적인 하스켈 소개서를 읽어야합니다.)

+1

스칼라가'>>'에 설탕을 제공하지 않는 이유는 무엇입니까? –

+0

scala는 for의 형태로 모나드 독해력을 제공하기 때문에 나는 생각한다. 어쩌면 계산 순서가 유지되지 않을 수도 있습니다. 편집 : 신경 쓰지 마라. –

+1

Monad에 대한 답은 정말 좋습니다. 그것은 단지 프로그래밍 패턴입니다. 대단히 "검은 마법"은 없습니다. –