Functional Programming - Lazy Evaluation

Haskell에서 특이한 점은 lazy evaluation을 한다는 점입니다. scala등 다른 언어에서도 lazy evaluation을 지원하지만, Haskell은 strict로 만들지 않는 이상 모든 부분이 lazy evaluation을 한다는 점입니다. Introduction 지금까지 우리는 evaluation이 Haskell expression에 대해 어떻게 이루어지는지 자세하게 다룬 적이 없었습니다. 사실 우리는 다음과 같은 단순한 방법으로 evaluation을 수행하였습니다. 불필요한 평가(unnecessary evaluation)을 피해라. 프로그램이 더 모듈화(modular) 될 수 있도록 하라. 무한(infinite) list에 대해 프로그램이 수행할 수 있도록 하라. 위에 따라 Haskell의 평가 기술(evaluation technique)은 게이른 평가(lazy evaluation)이며, 따라서 Haskell은 lazy functional language라고 말 할 수 있습니다.…

Keep reading

Functional Programming - The Countdown Problem

이번 포스팅은 Haskell의 새로운 컨셉을 설명하는 것이 아닌 Haskell을 이용하여 어떻게 개발하는지 알아보겠습니다. 보통 개발 초기에는 동작하지만 다소 복잡하고 비효율적으로 코드를 작성하게 됩니다. 이후 refactoring을 하며 효율적인 방향으로 수정합니다. 하지만 초기 목표는 효율성과 관계없이 가장 간단한 프로그램을 만드는 것입니다. 하지만, 지금 지금까지 배운 코드는 Haskell Compiler에서 동작하는 코드로 실제 상황에 적용하기 어려울 수 있습니다. 그러나 이 강의에서 목표는 다음처럼 functional programming 개념을 익히고 적용하는 것입니다. Think like a fundamentalist but code like a Hacker What Is CountDown? 그럼 Countdown 문제는 뭘까요? 예를 들어, 아래와 같은 숫자와 연산자(operator)를 받을…

Keep reading

Functional Programming - Declaring Types and Classes

우리는 이전 Parser를 배울때 type을 정의했었습니다. 이와 마찬가지로 함수를 정의하듯 type을 정의할 수 있습니다. 앞으로 우리는 어떻게 새로운 type을 만들고 type class를 정의하는지 보는 동시에 기존 OOP(Object Oriented Programming)과의 비교해보겠습니다. 문법적으로는 다를 수 있지만, 공통된 사항들을 논의할 수 있을 것입니다. Type Declarations Haskell에서는 기존에 있는 type에 대한 새로운 이름을 정의할 수 있습니다. type String = [Char] 지금까지 자주 사용해왔던 String은 [Char] 로 Char List 입니다. 따라서 위와같이 표현한 것을 볼 수 있습니다. 또한, 편리하게 표현하기 위해 사용하기도 하는데 다음 예가 그러합니다. type Pos = (Int,Int) 편리하게 위치(position)을…

Keep reading

Functional Programming - Interactive Programs

초창기 Haskell은 다른 언어들과 달리 그 효용성을 증명하는 것이 어려웠습니다. 그 이유는 다른 언어들을 이용할 때는 쉽게 할 수 있는 외부와의 소통(communication)의 어려움이었습니다. 예를 들어, 우리는 어떤 언어를 사용하든 'hello world!'를 출력하였습니다. System.out.println("hello world!"); 위 코드는 standard output을 이용하여 사용자에게 결과를 보여주었습니다. 하지만, haskell은 사용자로부터 input/ouput을 주고 받기위한 I/O Stream이 존재하지 않았습니다. 오늘날 haskell은 I/O monad를 통해 외부와 소통할 수 있게 되었습니다. 이때까지 input을 받고 string, integer 또는 tuple과 같은 output을 돌려주는게 전부였습니다. 하지만, C# 또는 Java와 같이 계속해서 새로운 input을…

Keep reading

Functional Programming - Functinal Parsers and Monads

Parser란 무엇일까요? 아래 정의와 같이 한 text를 구조에 따라 분석하는 프로그램을 의미합니다. 흔히 우리는 문장을 나눌때 사용합니다. A parser is a program that analyses a piece of text to determine its syntactic structure. The Parser Type Haskell에서의 Parser를 알아봅시다. type Parser = String -> Tree Haskell에서 Parser는 한 함수로 String을 입력받아 tree형태를 돌려줍니다. 하지만, Parser가 꼭 입력받은 String 전체를 필요하지 않을 수 있습니다. 따라서 사용하지 않은 입력값을 돌려줄 수도 있습니다. type Parser = String -> (Tree, String) 또한, 아무 것도 없는 것을 포함하여 다양한 방법으로 Parsing 될 수 있어 다음과…

Keep reading