"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 범위 진행

범위 진행

2024-11-02에 게시됨
검색:548

Scope progression

명령형 프로그래밍에서는 일반적으로 다음과 같은 코드가 있습니다.

func addOneToSlice(xs []int) []int {
  rs := make([]int, len(xs))
  for i, value := range xs {
    rs[i] = value   1
  }
  return rs
}

그러나 for 루프에 대해서는 다음 사항에 유의하세요.

  • 각 반복에는 현재 요소에 요소를 추가하는 특정 목적이 있습니다.
  • 그러나 각 반복에는 작동할 수 있는 요소에 대한 제약이 없습니다.
  • xs[i 2] 및 rs[i 3]로 작업하면 우리가 가지고 있는 코드의 구조가 근본적으로 변경되지 않지만 최종 결과가 부정확해집니다.

F#에서 동일한 작업이 수행되는 방식을 비교하세요.

let rec addOneToList =
  function
  | [] -> []
  | x :: xs -> x   1 :: addOneToList xs

이제 다음을 고려하세요.

  • 함수 인수로 목록이 있습니다.
  • 기능적 언어의 목록은 연결 목록입니다.
  • 연결된 목록의 효율적인 표준 작업은 다음과 같습니다.
    • 머리 x를 꼬리 x에서 분리
    • 머리에 무슨 짓을 한 것 x
    • 매개변수로 전달된 목록과 빈 목록 비교 []

이러한 제한 사항을 고려하여 목록의 선두에 있지 않은 요소 y에 1을 추가하면 함수 구조가 크게 변경됩니다.

이제 두 스타일에서 계산이 어떻게 진행되는지 비교해 보세요.

  • 기능적 스타일에서는 위의 예에서 재귀 호출을 포함하는 새 값으로 새 범위를 만듭니다.
  • 명령형 스타일에서는 범위를 변경하지 않고 기존 값을 변경합니다.

기능적 스타일에서 두 범위를 계산 진행과 결합하면 다음과 같은 결과가 발생합니다.

  • 우리는 돌연변이를 피합니다.
  • 실행 흐름이 명시적입니다.
  • 우리가 다루고 있는 구조가 명확해졌습니다.
릴리스 선언문 이 글은 https://dev.to/lamg/scope-progression-4iil?1 에서 복제되었습니다.1 침해 내용이 있는 경우, [email protected]으로 연락하여 삭제하시기 바랍니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3