이것은 취직 전까지 할게 없어서 서러운 이민혁이 우연히 함수형 언어에 관심을 갖고 익히기 위한 여정의 한 부분이다.
학습은 여기서 하자! : http://learnyouahaskell.com/starting-out
트리비아에 대한 참고는, https://namu.wiki/w/Haskell
순수 함수형 언어. 사이드 이펙트가 적은 코드를 만들어 낼수 있다고 하는 이론상 최강의 언어. 여기서 'side effect'가 없다는 것은, 같은 입력으로 다른 값을 내는 경우가 없음을 의미한다. 진정한 의미의 '함수'? 하지만 실제로는 입출력 명령 등 다양한 기능을 사용하기 때문에 어렵다 함…
haskell.org에 가면 자신의 플랫폼에 맞는 설치 도구를 제공한다. 알아서 잘 해보았다.
전위함수들은 아래와 같은 용법으로 중위 함수 처럼 써먹을 수 있다.
91 `div` 10
let numbers = [4, 8, 12, 16, 12] // GHCi 에서 리스트를 선언한 코드.
Prelude> (1,2,3):(2,3,4):[] [(1,2,3),(2,3,4)]
마치 수학의 집합조건을 정의하는 것 처럼 리스트를 만들 수 있다.
[x*2 | x <- [1..10], x*2 >= 12] = [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
조건을 대입하는 것 역시 가능하다. 신기해. 원리가 뭘까. 문자를 이용해서도 만들 수 있다.
*Main> let nouns = ["mayer", "dog", "windows"] *Main> let adjectives = ["irritating", "annoying", "astonishing"] *Main> [adjective ++ " " ++ noun | adjective <- adjectives, noun <- nouns] ["irritating mayer","irritating dog","irritating windows","annoying mayer","annoying dog","annoying windows","astonishing mayer","astonishing dog","astonishing windows"]
여러 종류의 항목들을 하나의 '값'처럼 저장하는데 사용한다. 튜플은 리스트와 많이 비슷하긴 한데, 튜플은 여러 종류가 될 수 있다. 리스트가 하나의 종류를 여럿 늘어놓은 것과는 대조적.
(3, 'a', "hello")
괄호를 활용해서 선언하고 사용한다.
하스켈은 정적 타입 시스템을 갖추고 있다. 이것은 타입을 '컴파일'시간에 결정지어서 안정적인 코드를 만들어낸다고 주장한다.
JAVA나 Pascal과 구분되는 특징으로 하스켈은 '타입추론;type inference'이 있다.
이것은 :t (자료형)을 통해서 확인 할 수 있다. 이렇게 써먹어서 확인해보자. 웹페이지 내용을 차용함.
ghci> :t 'a' 'a' :: Char ghci> :t True True :: Bool ghci> :t "HELLO!" "HELLO!" :: [Char] ghci> :t (True, 'a') (True, 'a') :: (Bool, Char) ghci> :t 4 == 5 4 == 5 :: Bool
위의 내용에서 '::'의 의미는 'has type of'라는 것. 이를 list나 tuple 형태에 맞게 표현해서 보여주고 있다.
함수도 타입이 있다. 함수 작성시, 명시적 타입 형을 우리가 부여한다.
*Main> let addThree x y z = x + y + z *Main> :t addThree addThree :: Num a => a -> a -> a -> a
즉, 함수는 특정한 '타입'에서 '타입'으로 Mapping시키고 있는 것이다. 우리가 이것을 굳이 타입을 선언할 필요가 없는 이유는,
컴파일러가 타입추론을 하기 때문에. 함수에서 보면 파라미터가 여러개 있을지언정 딱히 파라미터 타입을 식별할 만한 것은 없는 모습인데, 맨 마지막에 나오는놈이 Return값의 타입이다.
왜, Int, Int, Int → Int
가 아니고 이런형태인지는 후술.
몇가지 타입들이 있다.
True
or False
Tuple
도 타입이긴 한데, 길이에 따라 독립적이다. 두개짜리랑 세개짜리랑은 다르다는 것.몇가지 타입 클래스 들이 있다. 연산자등등에서 사용된다.
Ordering
도 타입인데, GT(greater than), LT(Lesser Than), EQ(equal).Show
의 반대되는 개념. 값을 읽어들여서 적절한 형태로 변환 해준다.read “4”
와 같은 형태로 단독으로 쓰면, GHCI가 어떤식으로 값을 반환할지 몰라서 혼란스러워한다.열거
되었다 할 수있음. Enum타입 클래스의 장점은, 리스트범위에서 써먹을 수 있다는 거임.Prelude> fromIntegral(length [1,2,3,4]) + 3.3 7.3
이걸 만약 fromIntegral을 안쓰고 length만을 쓰면 타입 불일치로 에러가 난다.