프로그래밍은 문제를 해결하는 것이다. 문제 해결은 computation by calculation으로 볼 수 있다.
예)
3 * ( 9 + 5 ) => 3 * 14 => 42
위의 예를 함수 형태로 바꾸어 볼 수 있다.
simple x y z = x * ( y + z )
함수란 input이 같으면 output이 항상 같게 나오는 것을 의미한다.
계산의 과정중에 있는 것을 expression이라 하고 이의 최종 결과를 value라 한다. 모든 expression은 type을 갖는다. type은 같은 집합으로 묶을 수 있는 expression의 집합이다. 정수는 Integer, 문자는 Char등으로 표시한다. type은 항상 대문자로 시작해야 하고 value는 소문자로 시작해야 한다.
함수를 적을 때 type도 같이 적어준다.
simple :: Integer -> Integer -> Integer -> Integer
simple x y z = x * ( y + z )
실제로는 type을 적어주지 않아도 하스켈이 알아서 type을 추론해준다. 하지만, 가능하다면 항상 적어주는 것이 좋다. 그렇게 하는 것이 에러를 방지할 수도 있고 문서화에도 도움이 된다.
프로그래밍에 있어서 추상화(abstraction)는 매우 중요하다. 값에 이름을 다음과 같이 주어서 쓰거나,
pi = 3.14159
함수를 다음과 같이 쓰는 것이 추상화의 예가 될 것이다.
circleArea :: Float -> Float
circleArea r = pi * r^2
totalArea = circleArea r1 + circleArea r2 + circleArea r3
위의 함수 선언은 circleArea가 외부에서 쓰일 일이 없다면 다음과 같이 쓰는 것이 좋다.
totalArea = let circleArea r = pi * r^2
in circleArea r1 + circleArea r2 + circleArea r3
let 안에서 사용된 선언은 in 안에서만 유효하다.
임의의 길이의 데이터를 쓸 일이 있으면 list를 사용할 수 있다. 예를 들어, 1,2,3에 대한 list는 [1,2,3]으로 표시한다. element가 없는 list는 []로 표시하고 nil이라 읽는다. []에 x라는 element를 앞에 더하면 x : []로 표시할 수 있다. 따라서, [1,2,3]은 1:2:3:[]으로 표시할 수 있다.
list의 element의 합을 더하는 함수는 아래와 같이 만들 수 있다.
listSum :: [Float] -> Float
listSum [] = 0
listSum (x:xs) = x + listSum xs
위의 함수에 대한 적용은 pattern matching에 의해 이루어진다. pattern matching은 위로부터 아래로 matching이 될때까지 순서대로 이루어지며 matching이 되면 오른쪽의 내용이 계산된다.
값에 이름을 부여하거나 중복되는 expression을 함수로 만들어서 사용하는 것은 modularity의 측면에서도 좋다. 이렇게 함으로서 다른 곳에서도 똑같은 것을 다시 만들 필요없이 있는 것을 재활용하면 되기 때문이다.
하스켈에서 정수 표현의 경우 Integer와 Int를 사용할 수 있다. Int의 경우 CPU의 word 크기에 따른 최대/최소값을 가진다. Integer의 경우는 제한이 없이 사용할 수 있지만 효율성이 떨어진다.
Monday, August 1, 2011
Chapter 1: Problem Solving, Programming and Calculation
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment