Haskell 변수에 값을 할당하지 않고 바인딩합니다.
4481 단어 하스켈
위에서 설명한 대로 아래 본문에서는 정확하지 않은 용어의 사용법이 있습니다만 양해 바랍니다
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가 무한 리스트라도 지연 평가 덕분에 계산이 정지하는 구조가 되고 있습니다.
Reference
이 문제에 관하여(Haskell 변수에 값을 할당하지 않고 바인딩합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/lotz/items/aca1d179c14d4dca5099텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)