본문 바로가기

프로그래밍언어/Haskell

[Haskell] 프로그래밍 언어론 - 하스켈 언어(3) - Types

본 글은 프로그래밍 언어론과 하스켈 언어에 대해 학습하는 글입니다.


이번엔 하스켈의 유형중 타입에 대해 설명해봅니다.

 

타입은 크게 기본타입과 조합타입이 존재한다.

 

 

1. 기본 타입
 
Type 종류
Bool 타입 True, False
Int 타입 0, 1, -6
Char 타입 'A', 'b', '!'
String 타입 "", "aabb"
Double 타입 0.0, -1.2, 5.7
() 타입 ()

 

 

실제로 타입을 사용해보자.

 

슬프게도 티스토리에서 기본으로 하스켈 언어을 지원하지 않아서.. 추후에 코드 블럭을 만들어보겠음..

b1 :: Bool    -- b1 변수가 Bool 타입이라고 선언
b1 = True    -- b1 변수에 True 값을 대입

i1 :: Int    -- i1 변수가 Int 타입이라고 선언
i1 = 20    -- i1 변수에 20 값을 대입

c1 :: Char    -- c1 변수가 Char 타입이라고 선언
c1 = '!'         -- c1 변수에 ! 값을 대입

c2 :: String    -- c2 변수가 String 타입이라고 선언, (사실 String 타입은 Char의 리스트입니다)
c2 = ""           -- c2 변수에 빈 문자열을 대입

 

 

2. 조합 타입

 

타입
튜플타입 : (a, b) (1, 2), (True, 'c') 등등
튜플타입 : (a, b, c) ('q', 'w', 5), (1, 2, 3) 등등
리스트 타입 : [a] [ ], [1,2,3,4] 등등
함수 타입 : a -> b not, reverse, \x -> 1, \x -> x 등등

 

 

뭔소린지 모르겠으니, 하나씩 코드로 예시를 들어보자

 

-- 1. 튜플 타입
p1 :: (Int, Int)
p1 = (1, 2)

p2 :: (Int, Bool, Char)
p2 = (1, True, 'a')


-- 2. 리스트 타입
l1 :: [a]    -- a 타입의 리스트로 정의했지만, 아직 타입변수(a)가 뭔지 정해지지 않았기 때문에 임의의 리스트로 존재, 이것을 제네릭 타입이라고 한다.
l1 = []      -- 길이가 0인 리스트 대입

l2 :: [Int]
l2 = [1, 2, 3, 4]


-- 3. 함수 타입
f1 :: Bool -> Bool    -- Bool 값을 입력으로 받아서 Bool 값을 출력으로 뱉는 함수 정의
f1 = not                   -- 여기서 not은 하스켈 표준 라이브러리에 존재하는 함수로 f1이라는 함수에 그대로 바인딩됨
-- not 함수는 논리 부정을 제공하는 함수(T/F 반전)

f2 :: [a] -> [a]    -- a 타입 리스트를 입력으로 받아서 a 타입 리스트를 출력으로 받는 함수 정의, 여기서 a는 아직 타입이 미정
f2 = reverse     -- 여기서 reverse는 하스켈 표준 라이브러리에 존재하는 함수로 f2이라는 함수에 그대로 바인딩됨
-- reverse 함수는 리스트의 순서를 역순으로 뒤집는 함수,
-- 여기서 잠깐!!!!! 문자열 String도 Char리스트에 속하므로 문자열도 뒤집힙니다!!

f3 :: a -> Int    -- a 타입의 변수를 입력받아서 Int 타입으로 출력하는 함수 정의, 타입변수(a)는 미정
f3 = \x -> 1      -- 람다(\x)를 입력받아 1을 출력하는 함수, 이때 x의 타입은 무엇이든간에 받아서 처리할수 있다??

 

💡 람다식 표현.. 대체 무엇인교? 하니
람다식 표현은 주로 임시로 생성한 함수등과 같이 한번 사용하고 말 간단한 처리를 람다식 표현을 이용해 구현한다.

그렇다면 왜 쓸까??
-> 짧고, 간단하게 일회용 함수를 구현할수 있으므로 편함!! && 가독성도 좋음!!

 

이렇게만 설명하면 직관적이지 않으니 예시를 살펴보자

 

-- Int타입 변수 값을 두배로 곱하는 식
double :: Int -> Int
double x = x * 2

-- 그걸 람다식으로 구현
\x -> x * 2

--===================================

-- 리스트의 모든 값을 두배로 곱하는 식
double_f1 :: [Int] -> [Int]
double_f1 x = x * 2
map double_f1 [1,2,3]    -- 결과: [2,4,6]

-- 그걸 람다식으로 구현
map (\x -> x * 2) [1,2,3]    -- 결과: [2,4,6]

 

 

 

3. 사용자 정의 조합 타입
(사실 얘도 조합 타입에 속하긴 함)

to be continue..