# FP101x - week 1

몇 주 전, Coursera에서 시작하는 한 코스를 등록했는데… 너무 빡쎄서 ㅠ.ㅠ 어쩌지 하고 있던 상황에서 괜찮은 코스를 알게되었다.

FP101x Introduction to Functional Programming

edx 역시 Coursera와 같은 MOOC로 이 코스는 Delft University of Technology 라는 네덜란드 대학에서 진행되는 수업이다. 사실 제목에 101 이 보여서 더 끌렸다.ㅋㅋㅋㅋ

그리고 요즘 대세인 Functional Programming. 제목만 보고는 왠지 스칼라로 진행 할 것 같았는데 Haskell이다. 아 당황스러웠다. 전혀 모르는데.. 다행히 첫 수업은 하스켈의 문법부터 차근차근 알려주고 이 수업을 들으면 하스켈 뿐만 아니라 자바, 스칼라 등 다른 언어에서도 functional programming을 바로 써먹을 수 있다고 약을 판.. 아니 격려해 주니 맘 놓고 시작해 볼 만 한 것 같다.

수업은 총 8주로 이루어져 있고 avg 60% 이상 점수를 받아야 Certificate를 받을 수 있다. 점수는 11번의 homework와 7번의 lab assignment로 이루어진다.

# Github repo

https://github.com/fptudelft/FP101x-Content-2015 수업 mp3, slide, transcript, exercise 들이 올라온다.

# Week 1

  • Functional Programming의 역사와 간단한 설명
  • 하스켈 설치부터 간단한 문법을 알려준다.

# 설치

Glasgow Haskell Compiler (GHC) https://www.haskell.org/platform/

# 하스켈 문법

  • Select the first element of a list
> head [1,2,3,4]
1
  • Remove the first element from a list :
> tail [1,2,3,4,5]
[2,3,4,5]
  • Select the nth element of a list :
> [1,2,3,4,5] !! 2
3
  • Select the first e elements of a list :
> take 3 [1,2,3,4,5]
[1,2,3]
  • Remove the first n elements from a list :
> drop 3 [1,2,3,4,5]
[4,5]
  • Calculate the length of a list :
> length [1,2,3,4,5]
5
  • Calculate the sum of a list of numbers :
> sum [1,2,3,4,5]
15
  • Calculate the product of a list of numbers :
> product [1,2,3,4,5]
120
  • Append two lists :
> [1,2,3] ++ [4,5]
[1,2,3,4,5]
  • Reverse a list :
reverse [1,2,3,4,5]
[5,4,3,2,1]

# Function Application

(Mathematics) f(a,b) + c d >> (Haskell) f a b + c*d
f a + b
  • (f a) + b 를 의미한다
  • f (a + b) 가 아니라
Mathematics Haskell
f(x) f x
f(x,y) f x y
f(g(x)) f ( g x )
f(x, g(y) ) f x ( g y )
f(x)g(y) f x * g y
  • 하스켈 확장자
.hs

# example

  • test.hs
double x = x + x
quadruple x = double ( double x )
$ ghci test.hs
$ quadruple 10
> 40
$ take (double 2) [1,2,3,4,5,6]
> [1,2,3,4]
factorial n = product [1..n]
average ns = sum ns ‘div’ length ns
  • x ‘f’ y == f x y

  • $ :reload
    -- reading file -- GHCi 는 파일 수정을 detect 하지 않기 때문에 새로 리 로드를 해줘야 함

# Naming

  • lower-case로 시작 ex) myFun fun1 arg_2 x`

  • list arguments는 s로 ex) xs ns nss

# Layout Rules

  • same column 맞추기

# Useful GHCi Commands

Mathematics Haskell
:load {name} load script {name}
:reload reload current script
:edit {name} edit script {name}
:edit edit current script
:type {expr} show type of {expo}
:? show all commands
:quit quit GHCi
:t {expr} {expr} :: {type}