게시물의 이상한 제목에 사과드립니다. 설명하는 가장 좋은 방법은 무엇인지 모르겠습니다.F # - 시퀀스 변환을 적용 할 때 컨텍스트 변경 가능
일반적인 문제 :
또한,리스트의 각 항목을 제외하고, Seq.map (또는 유사한 기능)의 순차적 인 응용 프로그램을 수행합니다 "상황"에 전달합니다. 각 반복은이 "컨텍스트"를 수정할 수 있으며 업데이트 된 버전은 목록의 다음 항목으로 전달되어야합니다.
특정 문제 :
나는 F #에서 컴파일러를 만들고 있습니다. 내가 현재하고있는 단계는 스택 기반 IL을 레지스터 기반 IL로 변환하는 것이다. 나는 스택 기반 일리노이를 "걸으며"현재의 "평가 스택"(.NET의 평가 스택과 유사)을 수행 할 수 있다고 생각했다. 각 스택 IL opcode는 분명히 스택을 변경합니다 (예 : "add"opcode가 스택에서 두 항목을 팝하고 결과를 푸시). 이 업데이트 된 스택은 다음 opcode의 방출주기로 전달됩니다.
나는 C# 배경에서 오는 기능 프로그래밍 (나는 1 주일 전에 배웠다)에 매우 익숙하다는 것에 주목한다. 나의 주요 질문은 "이것을하기위한 '기능적인'방법은 무엇인가?"
여기에 '기능적'접근 방식 (psudocode)이 무엇인지에 대한 가장 좋은 추측이 있습니다. 나는 "transformStackToRegisterIL"의 튜플 반환 값을 싫어한다. 불변 값의 표준을 유지하고 싶다면 필요합니까? 또한 과도하게 긴 일리노이 블록에 스택 오버플로가 생길까 걱정됩니다. 이것이 내 관심사입니까?
let rec translate evalStack inputIl =
match inputIl with
| singleOpcode :: tail ->
let (transformed, newEvalStack) = transformStackToRegisterIL evalStack singleOpcode
transformed :: translate newEvalStack tail
| [] -> []
편집 : List.scan은 내가 원하는 것의 내장 기능입니까? (비슷하지만 정확하지는 않지만 ... 올바른 것일 수도 있습니다.)
List.reduce가 어떻게 작동하는지 완전히 모르겠습니다. 코드 예제를 줄 수 있습니까? 컨텍스트가있는 "맵"기능보다는 오히려 더 많은 집계/축소를 목표로하는 것 같습니다. – khyperia
아 맞아. 나는'List.fold'를 의미했다. 그 두 사람은 때때로 혼란스러워합니다. – mydogisbox