Haskell #5 (Texas ranges)
이번 장에서는 리스트를 만들때 모든 값을 입력하지 않고, 특정 범위의 값을 자동을 만들어 주는 방법들을 학습합니다. 범위 지정자(range)를 사용하면 숫자(1–10)나 문자(a-z)같은 열거될 수 있는 타입에 대해서는 하스켈이 내부적으로 리스트의 다음에 나올 값을 예측하여 넣어줍니다. 문법적 소금이긴 하지만 이런 언어의 기능들을 사용하여 개발자의 시간을 아낄 수 있습니다. 개인적으로는 하스켈의 Range라는 기능은 여러가지로 잘 정의된 문법은 아닌 것으로 보입니다.
하스켈에서는 아래 예제와 같이 범위(Range)를 지정하여 리스트를 생성할 수 있습니다.
예제와 같은 범위 지정은 열거형 타입(Number, Character)만 가능합니다.
Range는 위 예제와 같이 증분 단위를 설정할 수 있습니다. 하지만 [1,2,4,8,16..100]과 같이 2²로 리스트를 만드는 등의 규칙을 만들어서 생성할 수는 없습니다. 또한 20부터 1까지의 리스트를 생성할 때는 [20..1]로 쓰면 안되고, [20,19..1]로 사용해야 합니다.
위와같이 Range에 실수를 사용했을때도 이상한 결과가 나오는 것을 확인하실 수 있습니다. Ragne에는 실수를 사용하지 않는 것이 좋겠습니다.
위와 같이 Range의 최대값을 지정해주지 않으면 무한대를 의미합니다. (지면관계상 생략함) 만약 13의 배수, 24개까지 포함한 리스트를 생성한다면 아래와 같이 두가지 방법을 사용하실 수 있습니다.
하지만 take를 사용하는 방법이 더 좋습니다. 왜냐하면 하스켈은 게으르기 때문입니다. 24개의 결과를 take를 사용하여 무한대로부터 가져와도 하스켈은 미리 계산하지 않습니다. 따라서 13을 곱하면서 리스트를 만드는 것보다 두번째 방법이 더 효율적입니다
- cycle : 입력받은 리스트를 무한히 반복하는 함수 입니다. 따라서 take 함수같은 것을 사용하여 필요한 만큼만 얻어올 수 있습니다.
- repeat : 입력받은 Element 한개를 무한히 반복하는 함수입니다.
- replicate : 첫번째 인자는 반복 횟수이고, 두번째는 반복할 Element 입니다. take 3 repeat 10이랑 같은 결과입니다.