Haskell 변수에 값을 할당하지 않고 바인딩합니다.

4481 단어 하스켈
바인딩이라는 용어를 사용하는 방법에 대한 자세한 설명을 받았습니다.
  • 이름의 속박이라는 이름의 속박 - 모나드와 나와 코모나드
  • 변수를 바인딩하는 것은 값이 아닌가? - ny-sketch-book

  • 위에서 설명한 대로 아래 본문에서는 정확하지 않은 용어의 사용법이 있습니다만 양해 바랍니다

    Haskell의 변수에는 값을 재대입할 수 없습니다. 그 때문에 변수에 값을 묶는 것을 대입이라고는 말하지 않고 속박이라고 합니다.


    예를 들면 최상위
    x :: Int
    x = 12
    x = 23
    

    라고 쓰면 컴파일이 에러가 되어 버립니다. 변수에 대한 속박은 어디까지나 값에 이름을 붙이는 행위이며, 상자와 같은 것에 값을 넣는 이미지는 적용되지 않습니다. 이러한 차이를 잘 나타내는 예가
    x = x + 1
    

    라는 식이지요. 대입의 이미지라면 변수 x로부터 꺼낸 값에 1을 더해 다시 변수 x에 대입하는 조작이라고 생각됩니다만, Haskell에서는 변수 x에는 x+1이라고 하는 값이 속박되고 있어 그 x와 는 x+1 이라는 값이며, 그 x 란?

    이 특성과 지연 평가(값이 필요할 때까지 평가되지 않는 Haskell의 평가 전략)을 활용한 흥미로운 프로그램의 예를 살펴보겠습니다.
    > fib = 1 : 1 : zipWith (+) fib (tail fib)
    > take 10 fib
    [1,1,2,3,5,8,13,21,34,55]
    

    fib는 피보나치 수열의 무한 목록을 구현합니다. (:)는 왼쪽의 값을 오른쪽의 리스트의 선두에 부가하는 함수, zipWith는 2개의 리스트의 대응하는 위치에 있는 값에 이항 연산을 적용해 새로운 리스트를 만드는 함수, tail은 리스트의 선두의 요소만 제거하는 함수입니다.
    (:) :: a -> [a] -> [a]
    zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
    tail :: [a] -> [a]
    

    fib는 1, 1이라는 값으로 시작하고, 다음은 fib의 1번째와 fib의 2번째 요소를 더한 값, 다음은 fib의 2번째와 fib의 3번째 요소를 더한 값이다. 같은 무한 목록으로 정의됩니다. take은 목록에서 n 개의 값을 가져오는 함수이므로,
    take :: Int -> [a] -> [a]
    

    fib의 값을 10개 가져오면 fib의 평가는 10번째 요소까지밖에 필요하지 않기 때문에, fib가 무한 리스트라도 지연 평가 덕분에 계산이 정지하는 구조가 되고 있습니다.

    좋은 웹페이지 즐겨찾기