SlideShare a Scribd company logo
1 of 11
Download to read offline
Haskell
Study
1. 기본 개념들
표현식 - 수식
ghci를 켜서(cmd창 or 터미널에서 ghci라고 타이핑) 아래 코드들을 치고 결과를 확인해봅시다.
Prelude> 2 + 15
17
Prelude> 49 * 100
4900
Prelude> 1892 - 1472
420
Prelude> 5 / 2
2.5
일반적인 연산들은 우리가 생각하는 그대로 동작합니다.
표현식 - 수식
다른 언어들과 마찬가지로 괄호로 연산의 우선 순위를 정할 수 있습니다.
Prelude> (50 * 100) - 4999
1
Prelude> 50 * 100 - 4999
1
Prelude> 50 * (100 - 4999)
-244950
Prelude> 5 * (-3)
-15
주의 : Haskell에서 음수를 다룰 때는 반드시 괄호로 감싸는 것이 좋습니다. 컴파일러가 뺄셈 연산과
부호 연산을 헷갈려합니다.
표현식 - 비교
비교 구문도 타 언어와 거의 같습니다. 단, 서로 다름을 나타내는 연산자는 /= 입니다.
Prelude> True && False
False
Prelude> 3 /= 2
True
Prelude> not False
True
Prelude> 1 == 2 || 3 == 3
True
표현식 - 함수
지금까지 다룬 연산들 ( +,-,*,/, == 등등) 역시 함수입니다. 이 함수들은 중위 함수기 때문에 인자들
중간에 함수를 넣었지만 대부분의 함수들은 전위 함수죠. 일반적인 함수들에 대해 알아봅시다.
Haskell에서 함수 호출은 타 언어와 조금 다릅니다. Haskell에서 함수 호출은 단순히 함수의 이름과
인자 사이에 공백을 넣는 것을 통해 이루어집니다.
C++ : f(2,3,4)
Haskell : f 2 3 4
C++ : someFunc(a,b,3,f(2,3))
Haskell: someFunc a b 3 (f 2 3)
표현식 - 함수
함수 호출도 GHCi를 통해 테스트해 봅시다.
Prelude> (+) 3 5
8
Prelude> succ 8
9
Prelude> min 10.1 9.5
9.5
Prelude> succ 9 + max 5 4 + 1
16
Haskell에서 함수 어플리케이션(함수 이름과 인자를 통해 함수를 호출한 것)은 가장 높은 우선순위를
갖습니다. succ 9 + max 5 4 + 1은 (succ 9) + (max 5 4) + 1과 동일합니다.
표현식 - 함수
Haskell에서 인자를 2개 받는 함수의 경우 backtick(`)을 이용하여 중위 함수로 표현할 수 있습니다.
Prelude> 5 `div` 3
1
Prelude> 5 `mod` 3
2
Prelude> 5 `max` 4
5
Prelude> 5 `min` 4
4
div나 mod같은 함수는 중위 함수로 썼을 때 가독성이 좋습니다. max나 min같은 경우는 좀
애매하네요.
함수 만들기
이제 간단한 함수를 한 번 만들어봅시다. 아무 텍스트 에디터에서나 아래 코드를 작성한 후 first.hs(
혹은 원하는 이름)로 저장하고 GHCi에서 실행시켜봅시다.
first.hs
double x = x + x
파일을 저장한 후 저장한 폴더에서 GHCi를 실행하고 :l (fileName)구문을 통해 작성한 코드를
불러오면 됩니다.
Prelude> :l first.hs
[1 of 1] Compiling Main
Ok, modules loaded : Main
Prelude> double 3
6
함수 만들기
Haskell에서 함수의 선언 순서는 상관이 없습니다.
first.hs
double2 x y = double x + double y
double x = x + x
ghci에서 다시 실행해 봅시다.
Prelude> :l first.hs
[1 of 1] Compiling Main
Ok, modules loaded : Main
Prelude> double2 3 5
34
if - then - else
타 명령형 언어에서 조건문으로 쓰이는 if 구문이 Haskell에서는 표현식입니다. C++의 삼항 조건
연산자와 유사하다고 생각하시면 됩니다. 표현식이기 때문에 else 부분이 빠질 수 없으며 식 자체로
하나의 결과 값이 됩니다.
Haskell : if (조건) then (조건이 참일 때 값) else (조건이 거짓일 때 값)
C++ : (조건) ? (조건이 참일 때 값) : (조건이 거짓일 때 값)
이 걸 이용해서 함수를 만들어 봅시다.
first.hs
-- 100보다 작으면 2배, 아니면 원래 수를 그대로 돌려주는 함수
doubleIf x = if x < 100 then x * 2 else x
연습 문제
•	 even
숫자 하나를 받아서 그 숫자가 짝수면 True, 홀수면 False를 돌려주는 함수를 만들어 봅시다.
(* haskell에 이미 even이라는 이름의 같은 함수가 존재합니다. 함수의 이름은 even 말고 다른 걸로
쓰셔야 합니다. )
•	 factorial
숫자 n을 받아서 n!(1*2*...*n)을 계산하는 함수를 만들어 봅시다.

More Related Content

What's hot

What's hot (20)

Haskell study 15
Haskell study 15Haskell study 15
Haskell study 15
 
Haskell study 12
Haskell study 12Haskell study 12
Haskell study 12
 
Haskell study 14
Haskell study 14Haskell study 14
Haskell study 14
 
Cours php
Cours phpCours php
Cours php
 
SQL - שפת הגדרת הנתונים
SQL - שפת הגדרת הנתוניםSQL - שפת הגדרת הנתונים
SQL - שפת הגדרת הנתונים
 
系統程式 -- 附錄
系統程式 -- 附錄系統程式 -- 附錄
系統程式 -- 附錄
 
Boolean and conditional logic in Python
Boolean and conditional logic in PythonBoolean and conditional logic in Python
Boolean and conditional logic in Python
 
.php1 : les fondamentaux du PHP
.php1 : les fondamentaux du PHP.php1 : les fondamentaux du PHP
.php1 : les fondamentaux du PHP
 
colas de prioridad
colas de prioridad colas de prioridad
colas de prioridad
 
Python : Data Types
Python : Data TypesPython : Data Types
Python : Data Types
 
Complex C-declarations & typedef
Complex C-declarations & typedefComplex C-declarations & typedef
Complex C-declarations & typedef
 
C# loops
C# loopsC# loops
C# loops
 
Resume javascript
Resume javascriptResume javascript
Resume javascript
 
Data Binding
Data BindingData Binding
Data Binding
 
State Monad
State MonadState Monad
State Monad
 
Smart Pointers in C++
Smart Pointers in C++Smart Pointers in C++
Smart Pointers in C++
 
Packages,interfaces and exceptions
Packages,interfaces and exceptionsPackages,interfaces and exceptions
Packages,interfaces and exceptions
 
Scala 3 by Example - Algebraic Data Types for Domain Driven Design - Part 2
Scala 3 by Example - Algebraic Data Types for Domain Driven Design - Part 2Scala 3 by Example - Algebraic Data Types for Domain Driven Design - Part 2
Scala 3 by Example - Algebraic Data Types for Domain Driven Design - Part 2
 
Beginner's Python Cheat Sheet.pdf
Beginner's Python Cheat Sheet.pdfBeginner's Python Cheat Sheet.pdf
Beginner's Python Cheat Sheet.pdf
 
Refactoring: A First Example - Martin Fowler’s First Example of Refactoring, ...
Refactoring: A First Example - Martin Fowler’s First Example of Refactoring, ...Refactoring: A First Example - Martin Fowler’s First Example of Refactoring, ...
Refactoring: A First Example - Martin Fowler’s First Example of Refactoring, ...
 

More from Nam Hyeonuk

More from Nam Hyeonuk (17)

Next 게임 실전 프로젝트 슬라이드
Next 게임 실전 프로젝트 슬라이드Next 게임 실전 프로젝트 슬라이드
Next 게임 실전 프로젝트 슬라이드
 
Haskell study 11
Haskell study 11Haskell study 11
Haskell study 11
 
Haskell study 10
Haskell study 10Haskell study 10
Haskell study 10
 
Haskell study 7
Haskell study 7Haskell study 7
Haskell study 7
 
Haskell study 0
Haskell study 0Haskell study 0
Haskell study 0
 
Multi thread
Multi threadMulti thread
Multi thread
 
Memory & object pooling
Memory & object poolingMemory & object pooling
Memory & object pooling
 
Database
DatabaseDatabase
Database
 
Exception&log
Exception&logException&log
Exception&log
 
Iocp advanced
Iocp advancedIocp advanced
Iocp advanced
 
Iocp 기본 구조 이해
Iocp 기본 구조 이해Iocp 기본 구조 이해
Iocp 기본 구조 이해
 
Tcp ip & io model
Tcp ip & io modelTcp ip & io model
Tcp ip & io model
 
Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약
 
구문과 의미론(정적 의미론까지)
구문과 의미론(정적 의미론까지)구문과 의미론(정적 의미론까지)
구문과 의미론(정적 의미론까지)
 
Gpg 1.1
Gpg 1.1Gpg 1.1
Gpg 1.1
 
Stl vector, list, map
Stl vector, list, mapStl vector, list, map
Stl vector, list, map
 
Age Of Empires II : Age Of Kings Postmotem
Age Of Empires II : Age Of Kings PostmotemAge Of Empires II : Age Of Kings Postmotem
Age Of Empires II : Age Of Kings Postmotem
 

Haskell study 1

  • 2. 표현식 - 수식 ghci를 켜서(cmd창 or 터미널에서 ghci라고 타이핑) 아래 코드들을 치고 결과를 확인해봅시다. Prelude> 2 + 15 17 Prelude> 49 * 100 4900 Prelude> 1892 - 1472 420 Prelude> 5 / 2 2.5 일반적인 연산들은 우리가 생각하는 그대로 동작합니다.
  • 3. 표현식 - 수식 다른 언어들과 마찬가지로 괄호로 연산의 우선 순위를 정할 수 있습니다. Prelude> (50 * 100) - 4999 1 Prelude> 50 * 100 - 4999 1 Prelude> 50 * (100 - 4999) -244950 Prelude> 5 * (-3) -15 주의 : Haskell에서 음수를 다룰 때는 반드시 괄호로 감싸는 것이 좋습니다. 컴파일러가 뺄셈 연산과 부호 연산을 헷갈려합니다.
  • 4. 표현식 - 비교 비교 구문도 타 언어와 거의 같습니다. 단, 서로 다름을 나타내는 연산자는 /= 입니다. Prelude> True && False False Prelude> 3 /= 2 True Prelude> not False True Prelude> 1 == 2 || 3 == 3 True
  • 5. 표현식 - 함수 지금까지 다룬 연산들 ( +,-,*,/, == 등등) 역시 함수입니다. 이 함수들은 중위 함수기 때문에 인자들 중간에 함수를 넣었지만 대부분의 함수들은 전위 함수죠. 일반적인 함수들에 대해 알아봅시다. Haskell에서 함수 호출은 타 언어와 조금 다릅니다. Haskell에서 함수 호출은 단순히 함수의 이름과 인자 사이에 공백을 넣는 것을 통해 이루어집니다. C++ : f(2,3,4) Haskell : f 2 3 4 C++ : someFunc(a,b,3,f(2,3)) Haskell: someFunc a b 3 (f 2 3)
  • 6. 표현식 - 함수 함수 호출도 GHCi를 통해 테스트해 봅시다. Prelude> (+) 3 5 8 Prelude> succ 8 9 Prelude> min 10.1 9.5 9.5 Prelude> succ 9 + max 5 4 + 1 16 Haskell에서 함수 어플리케이션(함수 이름과 인자를 통해 함수를 호출한 것)은 가장 높은 우선순위를 갖습니다. succ 9 + max 5 4 + 1은 (succ 9) + (max 5 4) + 1과 동일합니다.
  • 7. 표현식 - 함수 Haskell에서 인자를 2개 받는 함수의 경우 backtick(`)을 이용하여 중위 함수로 표현할 수 있습니다. Prelude> 5 `div` 3 1 Prelude> 5 `mod` 3 2 Prelude> 5 `max` 4 5 Prelude> 5 `min` 4 4 div나 mod같은 함수는 중위 함수로 썼을 때 가독성이 좋습니다. max나 min같은 경우는 좀 애매하네요.
  • 8. 함수 만들기 이제 간단한 함수를 한 번 만들어봅시다. 아무 텍스트 에디터에서나 아래 코드를 작성한 후 first.hs( 혹은 원하는 이름)로 저장하고 GHCi에서 실행시켜봅시다. first.hs double x = x + x 파일을 저장한 후 저장한 폴더에서 GHCi를 실행하고 :l (fileName)구문을 통해 작성한 코드를 불러오면 됩니다. Prelude> :l first.hs [1 of 1] Compiling Main Ok, modules loaded : Main Prelude> double 3 6
  • 9. 함수 만들기 Haskell에서 함수의 선언 순서는 상관이 없습니다. first.hs double2 x y = double x + double y double x = x + x ghci에서 다시 실행해 봅시다. Prelude> :l first.hs [1 of 1] Compiling Main Ok, modules loaded : Main Prelude> double2 3 5 34
  • 10. if - then - else 타 명령형 언어에서 조건문으로 쓰이는 if 구문이 Haskell에서는 표현식입니다. C++의 삼항 조건 연산자와 유사하다고 생각하시면 됩니다. 표현식이기 때문에 else 부분이 빠질 수 없으며 식 자체로 하나의 결과 값이 됩니다. Haskell : if (조건) then (조건이 참일 때 값) else (조건이 거짓일 때 값) C++ : (조건) ? (조건이 참일 때 값) : (조건이 거짓일 때 값) 이 걸 이용해서 함수를 만들어 봅시다. first.hs -- 100보다 작으면 2배, 아니면 원래 수를 그대로 돌려주는 함수 doubleIf x = if x < 100 then x * 2 else x
  • 11. 연습 문제 • even 숫자 하나를 받아서 그 숫자가 짝수면 True, 홀수면 False를 돌려주는 함수를 만들어 봅시다. (* haskell에 이미 even이라는 이름의 같은 함수가 존재합니다. 함수의 이름은 even 말고 다른 걸로 쓰셔야 합니다. ) • factorial 숫자 n을 받아서 n!(1*2*...*n)을 계산하는 함수를 만들어 봅시다.