나는 하스켈의스칼라 (다시 한번) 하스켈의 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 oldInput
및 setPosition oldPos
을 스칼라로 번역하는 방법을 모르겠다. 난 그냥 내가 <-
를 사용할 수에 말도 안되는 변수를 넣어 경우가
for {
oldPos <- getPosition
oldInput <- getInput
whyAmIHere <- setInput str
result <- parser
...
} yield result
처럼 작동합니다하지만 난 그게 맞다면, 내가 거기에 있어야한다는 확신, 그런 경우 확실하지 않다 생각 이렇게하는 더 좋은 방법.
아,이 질문에 대답 할 수 있다면, 한 번 더 대답 해 주실 수 있습니까? 모나드를 까만 마술처럼 느끼지 않기까지 얼마나 오래 꼼짝 않고 바라 볼 수 있습니까? :-)
고마워요! 토드
변수를 사용하지 않으려는 경우 이름을 밑줄로 바꿀 수 있습니다.'_ <- setInput str' – incrop
가장 스칼라 식 방법입니다. – TOB
정말로 가능할지 모르겠지만,이 문장을 for의 본문으로 옮겨 가면서 자연스럽게 보일 것입니다. 여기서 절차적인 스타일로 이동할 수 있습니다. – dividebyzero