본 글은 프로그래밍 언어론과 하스켈 언어에 대해 학습하는 글입니다.
이번엔 하스켈의 유형중 타입에 대해 설명해봅니다.
타입은 크게 기본타입과 조합타입이 존재한다.
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..
'프로그래밍언어 > Haskell' 카테고리의 다른 글
[Haskell]프로그래밍 언어론 - 하스켈 언어(2) - GHCI 와 Stack (0) | 2025.03.16 |
---|---|
[Haskell]프로그래밍 언어론 - 하스켈 언어(1) - Compile, translate (0) | 2025.03.16 |