티스토리 뷰

Haskell

Programming in Haskell (6) ch3. Exercise

newpolaris 2011. 1. 17. 00:17
Haskell에서의 타입은 서로 관계 있는 값들의 모임으로,
v::T 라는 표현은 v라는 값이 T 라는 타입에 속함을 나타낸다.
또한 T -> T 타입은 T 타입의 인자를 받아서 T타입의 결과로 대응시키는 함수를 나타낸다.

Haskell에서의 기본타입은 Bool, Char, String, Int, Integer, Float, Double 이 있다. 하나의 수는 여러 타입일 수 있는데 이 경우 위에서의 '::'기호를 이용하여 타입을 명시할 수 있다.
3::Int, 3::Integer, 3::Float
Int, Integer 모두 정수를 나타내는데
Int의 경우 고정된 크기의 저장공간을 사용하는 타입니다. 필자의 환경에서의 범위는 -2^31 ~ 2^31-1 이며 시스템에 따라 차이가 있다.
하지만 최소한 -2^29 ~ 2^29 -1의 범위는 보장하여 준다.
"Int is the type of machine integers, with guaranteed range at least -2^29 to 2^29 - 1"

반면 Integer의 경우 필요한 만큼 저장 공간을 사용하기 대문에 아무리 적거나 큰 정수도 표현가능한 타입이다.

다음으로 List 타입이 있는데
List는 서로 같은 타입의 원소를 포함하는 타입으로 대괄호 안에 쉼표로 구분하여 나타낸다.
['a','b','c','d'] :: [Char]
이러한 List에는 몇가지 특징이 있는데,
1. 위에 List의 타입을 나타낸 것과 같이 길이에 대한 정보는 포함하지 않으며,
2. 원소의 타입에 대한 제한이 없으며,
3. Haskell 자체가 Lasy evaluation을 취하기에 (해당 기능이 정말로 필요할 때 까지 미뤄두는 계산법) 무한한 길이의 List를 다룰 수 있다.

다음으로 Tuple 타입이 있다.
Tuple는 List와 달리 서로 다른 타입의 원소를 허용하지만 이로 인하여 유한한 개수의 원소를 가져야한다.
하지만 어떠한 타입의 원소를 허용한다는 점은 List와 동일하다
한가지 주의할 점은 계산의 우선순위를 정하기 위한 괄호 '(',')'와의 구분을 위해 1개의 원소를 가지는 것은 허용하지 않는다는 것이다.

1. 다음 값의 타입은 각각 무엇인가?
Prelude> :type [tail, init, reverse]
[tail, init, reverse] :: [[a] -> [a]]
위의 tail, init, reverse 모두 list를 입력으로 받아서 list를 출력하는 함수 이므로,
하나의 리스트로 묶을 수 있으며, 리스트에서는 원소의 숫자를 고려치 않기에 [[a] -> [a]] 와 같은 타입을 가진다.
여기서의 a는 타입 변수라고 하는데 어떠한 타입이라도 상관 없다는 표현으로 소문자로 시작한다.

2. 다음 함수의 타입은 각각 무엇인가?
Prelude> let twice f x = f ( f x )
Prelude> :type twice
twice :: (t -> t) -> t -> t
note: let은 GHCi에서만 동작하는 명령어으로서 간단하게 함수 선언을 가능케 한다.

4. 어째서 일반적으로 함수 타입을 Eq 클래스의 인스턴스로 사용할 수 없는가?
그렇다면 어떤 경우에 함수 타입을 Eq클래스의 인스턴스로 사용할 수 있겠는가?
답지에 따르면,
"In general, checking if two functions are equal requires enumerating all possible argument values, and checking if the functions give the same result for each of these values. For functions with a very large (or infinite) number of argument values, such as values of type Int or Integer, this is not feasible. However, for small numbers of argument values, such as values of type of type Bool , it is feasible."

'Haskell' 카테고리의 다른 글

jolly jumper  (0) 2011.01.18
내가 만든 .hs 파일 사용하기  (0) 2011.01.18
Programming in Haskell (5) ch2. Exercise  (0) 2011.01.14
Programming in Haskell (4)  (0) 2011.01.14
Programming in Haskell (3) Ch1. Exercise  (0) 2011.01.14
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크