하스켈 인터렉티브 환경

하스켈에 익숙해지기 가장 쉬운

방법은 인터렉티브 환경을

사용하는 것입니다.

 

인터렉티브 환경이란 하스켈의 표현식을

평가하고 하스켈 프로그램을 번역하는

인터프리터를 의미합니다.

또 GHC-compiled module을 불러옵니다.

(라이브러리 로드 처럼)

 

파이썬 정도에 발을 담궈봤다면

피이썬의 기본 인터프리터인 IDLE 와

비슷합니다.

 

인터프리터는 대부분 이렇게 생겼죠.

이것을 GHCi 라고 합니다.

 

Glasgow Haskell Compiler

Interactive Environment 의 약자입니다.

 

GHCI 하스켈
GHCI 하스켈

 

이 포스팅에서는 GHCi에 적응하기 위해

인터렉티브 환경에서 부담없이

이것저것을 해보려고 합니다.

 

 

 

 

1. 사칙연산 하기

인터프리터니까 사칙연산이

당연히 가능합니다.

 

아래 예제와 같이

숫자를 연산해봅니다.

 

괄호를 사용해서 연산의

순번을 정해줄 수도 있습니다.

C:\Users\masterkay>ghci
GHCi, version 9.0.1: https://www.haskell.org/ghc/  :? for help

ghci> 3+7
10
ghci> 55 * 110
6050
ghci> 2020 - 870
1150
ghci> 10 / 5
2.0
ghci> 10 / 3
3.3333333333333335
ghci> 10 + (30 * 2)
70

 

기본 부울 연산도 해보겠습니다.

AND 가  && 이고

OR 가 || 인 정도는

알고 있을 겁니다.

 

다른 언어와 문법적으로

차이가 나지 않습니다.

 

not 은 부정, 반정입니다.

이런 식으로 논리게이트 연산을

할 수 있고 분기문 등 조건식에서

사용할 겁니다.

 

ghci> True && True
True
ghci> True && False
False
ghci> False && True
False
ghci> False && False
False
ghci> True || True
True
ghci> True || False
True
ghci> False || True
True
ghci> False || False
False


ghci> not True
False
ghci> not False
True
ghci> True
True
ghci> False
False
ghci> not (True && True)
False
ghci> not (True && False)
True

 

숫자의 대소 비교도 가능합니다.

 

== 같다 > 보다 크다 < 보다 작다

를 사용해서 확인해봅니다.

 

ghci> 1 == 1
True
ghci> 1 == 0
False
ghci> 3 > 1
True
ghci> 3 < 1
False
ghci> 3 >= 1
True
ghci> 3 <= 3
True

 

문자열도 비교가 가능합니다.

대소문자를 구별합니다.

 

ghci> "hello Mr" == "hello Mr"
True
ghci> "hello Mr" == "hello MR"
False

 

함수의 사용

ghci 에는 하스켈의 라이브러리

함수를 사용할 수 있습니다.

 

하스켈은 모듈시스템으로 구성되는데

하나의 프로그램은 여러개의 모듈을

모아놓은 모듈입니다.

 

예상하겠지만 하스켈에는 수많은

모듈이 있고 레퍼런스가 있습니다.

 

하스켈을 마스터 하기 위해서는

모듈의 사용법을 익힌 후에

레퍼런스와의 싸움이 될겁니다.

 

워낙 많으니까 맛배기만

보고 가겠습니다.

import Data.List

ghci> intersperse ',' "HASKELL"
"H,A,S,K,E,L,L"
ghci> concat ["This"," is", " Haskell"]
"This is Haskell"
ghci> concat [[1,2,3], [4,5,6], [7,8,9]]
[1,2,3,4,5,6,7,8,9]

형식에 있어서 C나 다른 언어와

비슷한 듯 비슷하지 않은 듯 합니다.

 

컴퓨터 프로그래밍에서의

함수란 결국 함수 이름과

인자로 반환형태로 구성됩니다.

 

C계열 언어를 사용해왔다면

( ) 괄호를 사용하지 않는 부분이

신선하게 느껴질지 모르겠습니다.

 

import 는 모듈을 가져오는

문장입니다.

외부의 라이브러리를 가져오는 것은

다른 언어에서도 많이 있으니까

이해하기 어렵지 않습니다. 

 

C에서는 include 자바도 import

파이썬도 import 죠.

 

많은 개발자들이 사용하는

언어인 만큼 문서화가 잘되어 있습니다.

 

아래 링크 Documentation 에는

하스켈에 대해서 배울 수 있는

다수의 온라인 문서들을 모아놓았습니다.

 

2000년도 자료도 있는 것으로 봐선

상당한 전통의 언어로 알 수 있습니다.

 

https://www.haskell.org/documentation/

 

Documentation

 

www.haskell.org

 

좀 쉽게 접근할 수 있는 교재는

아래의 Learn you a Haskell for Great Good 입니다.

 

PDF버전도 어디에 있는 것 같은데

온라인에서 무료로 공개되어 있습니다.

 

http://learnyouahaskell.com/chapters

 

Chapters - Learn You a Haskell for Great Good!

Learn You a Haskell for Great Good! Introduction Starting Out Types and Typeclasses Syntax in Functions Recursion Higher Order Functions Modules Making Our Own Types and Typeclasses Input and Output Functionally Solving Problems Functors, Applicative Funct

learnyouahaskell.com

 

내장 함수들도 잠깐 보고 가겠습니다.

 

처음부터 함수의 사용법을 모두

이해할 필요는 없습니다.

 

쓰윽 보고 내려가면서

한 두번 실습을 해보면 충분합니다.

 

ghci> min 10 99
10
ghci> max 22 3
22
ghci> succ 9
10
ghci> succ 'A'
'B'

min 과 max 는 두 숫자를

비교해서 작은쪽 큰쪽을

리턴합니다.

 

succ 은 succesor (계승자)의

약어로 다음 숫자 혹은 다음

알파벳 코드를 리턴합니다.

 

직관적으로 이해하기가 좋습니다.

 

함수라고 해도 ( ) 괄호를 안씌워주니까

매우 편안한 느낌이 듭니다.

 

따지고 보면 +, -, *, / 같이

셈을 하는 사칙연산자들도

함수라고 볼 수 있습니다.

3 + 2 는 3과 2를 더한다는 뜻이지요.

 

인수를 2개 받고 하나의 결과를

리턴합니다.

 

하스켈 방식이라면 add 3 2

라고 표현할 수도 있습니다.

 

함수를 여러개 이어서 표현식을

만들어 보면 아래와 같습니다.

ghci> succ 3 + max 1 5
9
ghci> (succ 4 + min 2 7) * 3
21

 

함수 이름이 명확하니까

읽기가 더 쉬운 것 같습니다.

 

사칙연산은 가장 기초라고

생각하니까 그것을 일부러

다른 이름으로 바꿀 필요는

없겠습니다만

 

이러한 표기 방식만으로도

무엇을 의미하는지

이해가 빠르다는 것은

장점입니다.

 

여러 프로그래밍 언어의

튜토리얼을 만들고 있지만

문법이 가독성의 범위와 한계를

정하는 경향이 있기 때문에

문법에는 설계자의 철학이

들어 있습니다.

 

이런 미묘한 부분은 언어를

더 사용하면 할수록 진가를

알게 됩니다.

 

하스켈은 블록체인 개발에

사용되고 있기 때문에

앞으로 더 기대가 되는 언어입니다.

 

함수를 로딩하기

텍스트 에디터를 열고

아래의 코드를 입력합니다.

 

main 이란 이름으로

함수를 등록하는 것 입니다.

 

파일이름은 hello.hs 로 저장합니다.

 

main = putStrLn "Hello World, Haskell!"

 

ghci 로 들어와서 이 파일

hello.hs 를 로드합니다.

방법은 :l 명령어를 사용합니다.

 

아래에 보면 하나의 모듈이

로드되었다는 표시가 나옵니다.

하스켈에서 파일은 모듈입니다.

 

main 을 입력하면 코딩한

함수가 실행됩니다.

(문자열 출력)


ghci> :l hello
[1 of 1] Compiling Main             ( hello.hs, interpreted )
Ok, one module loaded.
ghci> main
Hello World, Haskell!

 

인자를 받는 사용자 정의 함수를

만들어 보겠습니다.

 

아래와 같이 myAdd a b 는

인자 a와 b 를 입력받는다는

것이고 그 뒤 = 이후는

함수의 코드입니다.

 

정수와 부동소수점 둘다

작동합니다.

 

하스켈은 정적 타입 시스템이지만

타입을 추정합니다.

 

흔히 정적 타이핑과 동적 타이핑을

이분법적으로 분리해서 보지만

하스켈은 양쪽의 장점을

적용한 언어입니다.

 

*hello.hs 파일

myAdd a b = a + b
mySub a b = a - b
mySquare a = a * a


*실행결과

ghci> myAdd 1 3
4
ghci> mySub 5 1
4
ghci> mySquare 5
25

 

이런 모듈 방식은 특징은

하나의 함수안에 수많은

코드를 작성하는 방식과는

것과 구분됩니다.

 

마치 레고 블록처럼 작은

블록들을 결합해서 전체

모듈을 만드는 방식입니다.

 

객체지향프로그래밍에 익숙한

사람들에겐 사람들은 처음에

좀 적응시간이 걸릴수도 있습니다.

 

요약

자바나 C, 파이썬 등 상용언어들을

중심으로 프로그래밍을 해왔고

거기에 익숙하다면 하스켈을

학습하는 것은 다소 골치아픈

부분이 있습니다.

 

티오비 인덱스에서 보면 하스켈은

50위 권 밖으로 밀려나있는 것을

볼 수 있죠.

 

역사는 오래되었지만 주로

학자들이 사용하는 언어라서

상용언어들과는 좀 다른 모습입니다.

 

하지만 다른 부분이 많은 만큼

기존의 프로그래밍 언어에서

사용하지 않았던 뇌를 많이

사용할 수 있고 학습적으로나

실력적으로나 많은 도움이 됩니다.

 

다음 포스팅에서는 하스켈의

주제별로 학습을 더 해보겠습니다.

공유하기

facebook twitter kakaoTalk kakaostory naver band