프로그래밍 Programming
Haskell Type, Typeclass, and Type variables
2018. 3. 16.Type A kind of label that every expression has. Category of things that expression fits. :t examine the types of some expressions :: is read as "has type of" The parameters are separated with -> There's no special distinction between the parameters and the return type. The return type is the last item in the declaration. Type Variable12Prelude> :t headhead :: [a] -> acs What is this a? It's actu..
Haskell_ 003 Typeclass
2018. 3. 15.A typeclass is a sort of interface that defines some behavior. If a type is a part of a typeclass, that means that it supports and implements the behavior the typeclass describes. Type signature of the == functionghci> :t (==) (==) :: (Eq a) => a -> a -> Bool The equality operator, == is a function. +, *, -, / and pretty much are all operators. If a function is comprised only of special characte..
Haskell_ 002 Type variables
2018. 3. 9.Type of the head function head takes a list of any type and returns the first element. The type declaration of head states that it takes a list of any type and returns one element of that type.ghci> :t head head :: [a] -> a What is this a? Types are written in capital case, so it can't exactly be a type. It's actually a type variable. That means that a can be of any type. polymorphic functions :..
Haskell_ 001 Type and typeclass
2018. 3. 5.Haskell has a static type system. The type of every expression is known at compile time.Haskell has type inference.A type is a kind of label that every expression has. It tells us in which category of things that expression fits.By using the :t comma, GHCI examine the types of some expressions. ghci> :t 'a' 'a' :: Char ghci> :t True True :: Bool ghci> :t "HELLO!" "HELLO!" :: [Char] ghci> :t (Tru..
하스켈 패키지 삭제하기 How to uninstall a Haskell package installed with stack?
2018. 2. 6.123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 (blackbriar) root@gcloudx:~/blackbriar/blackbriar# stack --helpstack - The Haskell Tool Stack Usage: stack [--help] [--version] [--numeric-version] [--hpack-num..
cabal install 사용방법 (1) How to cabal install (1)
2018. 2. 6.cabal은 하스켈로 작성된 소프트웨어를 다운로드받고 빌딩하는 명령프로그램이다. 이를 통해 Hackage repository 에 존재하는 모든 패키지를 다운받아 설치할 수 있다. 가끔 알수없는 오류를 일으키기도 하는데 본 포스팅읉 통해 올바른 cabal 패키지 설치방법을 알아보자. cabal, Cabal, cabal-install혼동을 피하기 위해 먼저 Cabal wiki page 의 설명을 먼저 보자."Cabal 은 패키지 및 빌드 시스템이다. Cabal 은 단지 패키지의 생성과 그 컨텐츠의 빌딩에만 관여한다. 패키지를 관리하지는 않는다. Cabal-Install 은 카발 패키지를 설치한다. 그것은 빌드시스템인 Cabal 과는 구분된다. 이러한 점들은 종종 새로운 사용자들에게 혼동을 일으킨다. 게다가 ..
Haskell Yesod의 템플릿 언어 세익스피어를 활용하여 웹페이지 만들기 (2)
2018. 2. 3.Haskell Yesod의 템플릿 언어 세익스피어를 활용하여 웹페이지 만들기 (2) 이전 포스팅에서는 헤더와 푸터 영역의 작성에 대해서 알아봤습니다. 현시점에서 샘플사이트의 모습은 대략 이런 느낌일 것입니다.이번 회차에서는 아래의 부분을 완성해보겠습니다.슬라이드쇼메인 컨텐츠템플릿 파일에 대해서 templates/default-layout-wrapper이 파일에는head태그에 포함된 meta태그와 title태그 및 닫힌 body 태그의 앞에 배치된 스크립트 등을 기술합니다. 사이트 전체의 레이아웃 헤더, 푸터, 사이드바 등의 구조)는 기술하지 않고, 해당 정보는 차후에 언급할 templates/default-layout 에 기술합니다.templates/default-layout이 파일에서는 사이트의 레이아..
Haskell Yesod의 템플릿 언어 세익스피어를 활용하여 웹페이지 만들기 (1)
2018. 2. 1.Haskell Yesod의 템플릿 언어 세익스피어를 활용하여 웹페이지 만들기 (1) 앞으로 2개의 포스팅을 통해 Yesod로 웹페이지를 구현해보겠습니다.먼저, Yesod로 Web 페이지를 구현하기 위한 템플릿 언어에는 다음이 있습니다.Hamlet들어쓰기를 활용한 네스트 표현Cassius (Lucius)Lucius 는 CSS 의 슈퍼세트로、CSS 기술Lucius 는 {} 를 통해 네스트 표현Julius들어쓰기로 네스트를 표현이상을 합쳐서 Shakespeare라고 부르고, 각각은 HTML, CSS, Javascript 에 대응합니다. HTML 이 Hamlet 에, Cassius (Lucius) 이 CSS 에, Javascript 에 Julius 가 대응하는 등 첫 글자가 동일한 것은 뭐 우연일 것입니다. W..
Yesod의 위젯에 대해서 (1)
2018. 1. 27.Widget 이란?Yesod의 경우 위젯의 역할은 HTML, CSS, Javascript 등의 컴포넌트를 적절히 하나의 HTML로 정리하기 위한 통일된 표현을 부여하기 위한 것입니다. 예를 들면, Web 페이지를 기술하는 실제에서는 아래의 형식적인 관습을 따르는 편이 좋습니다.CSS는 페이지의 head 부분에 기술한다Javascript은 body의 마지막에 기술한다jQuery 등의 외부 파일을 여러번 회독하지 않음타이틀태그는 한 번 출현위젯 컴포넌트컴포넌트의 종류실제 태그Yesod에서 취급하기 위한 함수 또는 템플릿 언어타이틀 ... setTitle외부의 스타일시트addStylesheet계열외부의 JavascriptaddScript계열CSS 코드Cassius or LuciusJavascript 코드Jul..
하스켈 익스텐션 사용법 How to Enable Extensions
2018. 1. 26.GHC extension은 적어도 3가지 방법으로 단독 또는 결합하여 사용가능합니다. ExtensionName 이라고 불리는 가상의 extension에 대해 알아봅니다. LANGUAGE Pragma개별 파일에 대해서는 파일 상단에 {-# LANGUAGE ExtensionName #-} 라는 형식으로 사용이 가능합니다 (module 헤더 이전, 또는 첫 번째 import 이전 및 module 헤더가 없다면 definition 이전에 위치). 여러 개의 LANGUAGE pragmas 를 사용함으로써 여러개의 extension 도 사용가능합니다. 예를 들면, ScopedTypeVariables, LiberalTypeSynonyms, 와 MultiWayIf 라는 3개의 extension 을 사용하려면 다음의 3..
하스켈 Yesod 튜토리얼 - 페이지 추가하기 Minimal echo application
2018. 1. 19.아래 4개의 파일과 디렉토리에 주안점을 두고 본 튜토리얼을 진행한다. 현재 구성은 다음 이미지와 같다.config/routesHandler/templates/config/modelsconfig/routes 는 URL → Code 로 매핑하는 설정을 하는 파일이다. config/models 은 데이터베이스 테이블 같은 지속성 객체에 대한 설정을 다룬다. templates/HTML, js, 그리고 CSS 템플릿 파일을 포함한다.Handler/ 디렉토리는 URL 을 통해 접근되는 코드를 포함한 파일이 들어있다.Yesod framework의 보안성을 평가하기 위해 아래와 같이 간단한 echo 어플리케이션을 만든다. /echo/[some text]로 접속했을 때 h1 블럭 안에 있는 "some text"를 반환하..
하스켈 Yesod Illegal view pattern: fromPathPiece -> Just dyn_anHx
2018. 1. 19.1234567891011121314151617 blackbriar-0.0.0: build (lib)Preprocessing library blackbriar-0.0.0...[11 of 12] Compiling Handler.Echo ( src/Handler/Echo.hs, .stack-work/dist/x86_64-linux/Cabal-1.24.2.0/build/Handler/Echo.o )[12 of 12] Compiling Application ( src/Application.hs, .stack-work/dist/x86_64-linux/Cabal-1.24.2.0/build/Application.o ) /src/Application.hs:50:1: error: Illegal view pattern: f..
하스켈 Yesod Echo.hs:6:48: error: parse error on input ‘{’
2018. 1. 19.하스켈 Yesod 페이지를 추가하는 튜토리얼을 진행하는 중 다음과 같이 Echo.hs:6:48: error: parse error on input ‘{’ 을 만나는 경우 다음과 같이 처리한다. src/Echo.hs 123456module Handler.Echo where import Import getEchoR :: String -> Handler HtmlgetEchoR theText = defaultLayout [whamlet|#{theText}|]cs 상기 소스를 rebuild 하면 다음과 같은 에러 발생1234567[11 of 12] Compiling Handler.Echo ( src/Handler/Echo.hs, .stack-work/dist/x86_64-linux/Cabal-1.24.2.0/bu..
하스켈 Starting out - (9) 타입 변수 Type variables
2017. 12. 5.head 함수의 타입이 무엇이라고 생각하는가? head 함수는 리스트를 받아 첫 번째 요소를 반환한다. 지금 확인해보자. Prelude> :t headhead :: [a] -> a여기서 a는 무엇인가? 타입을 뜻하는 것인가? 앞서 타입은 대문자로 쓴다고 말한바 있다. 그러므로 a는 타입이 아니다. 타입이 아니라 타입변수(type variable)이다.a는 어떤 타입이라도 될 수 있다는 의미이다. 다른 언어의 제너릭같은 개념이다. 타입 변수를 가지고 있는 함수는 다형함수(polymorphic functions) 라고 부른다. head 의 타입 선언은 어떤 타입의 리스트를 받아서 그 타입의 한 원소를 반환한다는 말이다. fst 함수를 기억하는가? 페어의 첫 번째 요소를 반환하는 함수이다. 타입을 확인해보자...
하스켈 Starting out - (8) 타입
2017. 12. 5.하스켈은 정적 타입 시스템이다. 모든 표현식의 타입이 컴파일 당시에 이미 알려져있다. 예를 들어 불린 타입을 어떤 숫자로 나눌려고 하면, 컴파일되지 않는다. 프로그램이 충돌하기 전에 컴파일 당시에 이런 오류가 발견되는 것이 좋다. 하스켈의 모든 것은 타입을 가지며, 따라서 컴파일러는 컴파일하기 전에 프로그램에 대해 어느 정도 판단을 할 수 있다. 자바나 파스칼과는 다르게 하스켈은 타입추론(type inference)을 가진다. 만약 숫자를 쓰면, 굳이 하스켈에게 그것이 숫자라고 말할 필요가 없다는 것이다. 하스켈에 있어 타입 시스템을 이해하는 것은 매우 중요하다.타입은 모든 표현식이 가지는 일종의 라벨이다. 표현식이 어떤 카테고리에 속하는지 말해주는 셈이다. 표현식이라는 것은 True 같은 불린이나 "h..
Error haskell: Variable not in scope
2017. 12. 4.다음과 같이 Variable not in scope 에러가 발생하는 경우Prelude> addThree :: Int -> Int -> Int -> Int :89:1: error: Variable not in scope: addThree :: Int -> Int -> Int -> Int 이 경우에는 다음과 같이 멀티플 라인 입력을 해야한다. 아니면 해당 코드를 파일로 저장하여 :load 을 이용하여 로딩할 수도 있다.Prelude> :{Prelude| addThree :: Int -> Int -> Int -> IntPrelude| addThree x y z = x + y + zPrelude| :}Prelude> addThree 3737 383839 393939393939393939781515Prelude>
하스켈 Starting out - (7) 튜플 Tuples
2017. 12. 2.하나의 값에 다수의 값을 저장한다는 측면에서 튜플은 리스트와 유사하다. 하지만 몇 가지 근본적인 차이점이 있다. 숫자의 리스트는 숫자의 리스트일 뿐이다. 그 자체가 타입이고 하나의 숫자만 갖느냐 아니면 무한개의 숫자를 갖느냐는 아무런 문제가 되지 않는다. 하지만 튜플은 결합시킬 값의 갯수를 정확히 알고 있을 때 사용할 수 있다. 얼마나 많은 요소를 포함하고 있고 그 요소의 타입이 무엇인지에 따라 타입 또한 결정된다. 튜플은 괄호로 표시되고 구성요소는 콤마로 구분된다.다른 주요한 차이점은 구성요소들이 동질(homogenous)의 것일 필요는 없다는 것이다. 리스트와 다르게 튜플은 다양한 타입의 요소를 포함할 수 있다.하스켈에서 2차원의 벡터를 어떻게 나타낼 수 있을지 생각해보자. 하나의 방법은 리스트를 사..
하스켈 Starting out - (6) list comprehension
2017. 12. 2.10보다 작은 자연수를 2배로 곱하는 리스트를 만들려면 take 10 [2,4..]와 같은 방식으로 작성할 수 있다. 이와는 달리 list comprehension 을 사용할 수 있는데, 이는 set comprehensions과 매우 유사하다. 아래에서 사용한 list comprehension 즉, [x*2 | x [x*2|x 그러면 위의 구문에 조건을 붙여보자. 이제 2배를 했을때 12보다 큰 원소만 골라내보자. 다음과 같다.Prelude> [x*2|x = 12][12,14,16,18,20]Prelude>그러면 50에서 100까지 모든 숫자에 대해서 7로 나누는 경우 나머지가 3인 원소만 골라내보자.Prelude> [x|x boomBangs xs = [ if x [ x | x [x*y | x [adje..
ghci, stack ghci 버전 확인하기
2017. 12. 2.다음과 같이 함수를 정의할 때 parse error 가 나는 것은 ghci 버전 차이에 따른 것이다. GHCi 가 7.x 또는 그 미만인 경우에는 let 을 통해 함수를 정의해야 한다. Prelude> boomBangs xs = [if x
하스켈 Starting out - (5) range, cycle, repeat, replicate 함수
2017. 12. 2.Range 함수는 숫자, 알파벳 등 셀수 있는 원소들을 산술적으로 나열할 때 유용하게 쓰인다. 예를 들어, 1에서 20까지 모든 자연수를 포함하는 리스트를 만들려면 [1..20]라고 작성하면 된다. 물론[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20] 와 같이 작성해도 똑같으나 이건 멍청한 방법이다. Prelude> [1..20][1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]Prelude> ['a'..'z']"abcdefghijklmnopqrstuvwxyz"Prelude> ['K'..'Z']"KLMNOPQRSTUVWXYZ"Prelude>그러면 1과 20 사이에 있는 짝수로 이루어진 리스트는 어떻게 만들 수 있는가?..
하스켈 Starting out - (4) 리스트 입문
2017. 12. 1.length는 리스트의 길이를 반환한다.Prelude> length [5,4,3,2,1]5null 은 리스트가 비어있는지 체크해서 True, False 를 반환한다. Prelude> null [1,2,3]FalsePrelude> null []Truereverse 함수는 리스트를 반전시킨다.Prelude> reverse [5,4,3,2,1][1,2,3,4,5]take 함수는 숫자와 리스트를 인수로 갖고, 리스트의 처음부터 원소를 일정 갯수 가져온다. Prelude> take 3 [5,4,3,2,1][5,4,3]Prelude> take 1 [3,9,3][3]Prelude> take 5 [1,2][1,2]Prelude> take 0 [6,6,6][]Prelude>해당 리스트에 포함된 원소의 갯수보다 많은 수를..
하스켈 Starting out - (3) 리스트 입문
2017. 12. 1.하스켈에서 리스트는 동질(homogenous)의 데이터 구조이다. 리스트는 같은 타입의 원소를 가진다. 이 말은 정수의 리스트 또는 문자 리스트 등은 가질 수 있지만, 정수 일부, 문자 일부로 구성되는 리스트는 존재하지 않는다는 의미이다. * let 키워드를 이용하여 GHCI 에서 이름을 정의할 수 있다. GHCI 에서 let a = 1 이라고 하는 것은 스크립트에 a = 1 이라고 쓰고 로딩하는 것과 동일하다. Prelude> let lostNumbers = [4,8,15,16,23,42]Prelude> lostNumbers[4,8,15,16,23,42]Prelude>리스트는 대괄호로 표현되고고, 리스트의 값들은 콤마로 구분되어진다. 문자에 관해서 이야기하면 문자열은 단지 문자의 리스트라고 보면 된다...
하스켈 Starting out - (2) 함수를 만들어보자
2017. 11. 30.이제 간단한 함수를 만들어보자.함수는 호출될 때와 유사한 방식으로 정의된다. 함수 이름에 이어 공백 다음에 파라메터가 나온다. 하지만 함수를 정의할 때는 = 다음에 해당 함수가 수행할 기능이 나온다. 아래와 같이 작성한 후 baby.hs 등으로 저장하자. 해당 파일이 저장된 경로로 이동하여, :l baby 라고 치면 해당 스크립트가 로딩된다. baby.hs 1doubleMe x = x + x cs 123456789(blackbriar) root@gcloudx:~/blackbriar/blackbriar/lab/miran# ghciGHCi, version 7.10.3: http://www.haskell.org/ghc/ :? for helpPrelude> :l baby.hs[1 of 1] Compiling M..
하스켈 Starting out - (1) 간단한 수학 연산
2017. 11. 30.주요 연산은 직관적으로 이해가 가능할 것이다. 하스켈의 경우 다음 몇 가지 사항만 유의하자.+ 는 숫자의 경우에만 작동하고, == 는 비교가능한 대상간에 작동하기 때문에 위의 경우에는 오류를 발생시킨다. Prelude> 5 + "llama" :5:3: No instance for (Num [Char]) arising from a use of ‘+’ In the expression: 5 + "llama" In an equation for ‘it’: it = 5 + "llama"Prelude> Prelude> 5 == True :3:1: No instance for (Num Bool) arising from the literal ‘5’ In the first argument of ‘(==)’, namely ..
하스켈 웹프레임워크 - Yesod 라우팅 구문 Routing Syntax
2017. 11. 30.하스켈 웹프레임워크 - Yesod라우팅 구문 Routing Syntax MVC(Model-View-Controller) 프레임워크 관점에서 Yesod를 보면, 라우팅과 핸들러는 이 중 컨트롤러에 해당한다. 다른 웹개발 환경과 비교해보면 다음과 같다.PHP, ASP와 같은 파일 이름 기반 처리방식Django나 Rails 처럼 정규표현식에 기반하여 파싱하는 방식Yesod는 원리상 후자에 가깝다. 그렇다고 하지만 몇 가지 차이점이 있다. Yesod는 정규표현식을 사용하는 대신에 루트의 부분에 매칭한다.단방향 라우트-핸들러 매핑이 아니라, Yesod는 route datatype 또는 type-safe URL 라고 불리는 데이터 타입을 사용하고 양방향 전환 기능을 만들어낸다. Route SyntaxYesod는 기..
Haskell 웹프레임워크 Yesod 퀵 스타트 가이드
2017. 11. 25.Haskell 웹프레임워크 Yesod 퀵 스타트 가이드Yesod 웹 프레임워크의 주요 특징은 다음과 같다.safety & security guaranteed at compile timedeveloper productivity: tools for all your basic web development needsraw performancefast, compiled codetechniques for constant-space memory consumptionasynchronous IOthis is built in to the Haskell programming language (like Erlang) 1. Stack build tool은 다음 포스팅을 참조하여 설치한다. 하스켈 설치 및 Hello World ..
하스켈 설치 및 Hello World 출력해보기 Quick steps to get up and running with Haskell on Ubuntu
2017. 11. 24.하스켈 설치 및 Hello World 출력해보기Quick steps to get up and running with Haskell on Ubuntu 하스켈을 설치하고 Hello World 를 출력하는 간단한 예제를 실행해보자.먼저 가상환경을 만든다.12345678root@gcloudx:~# virtualenv -p python3 venvhaskellRunning virtualenv with interpreter /usr/bin/python3Using base prefix '/usr'New python executable in /root/venvhaskell/bin/python3Also creating executable in /root/venvhaskell/bin/pythonInstalling setup..
우분투 호스트이름 바꾸기
2017. 11. 23.우분투 호스트네임은 다음과 같이 변경할 수 있다. 호스트네임 임시 변경 (재부팅시 원상복귀됨)12345root@gcloud-seoul-5d188bdade7:~# hostnamegcloud-seoul-5d188bdade7root@gcloud-seoul-5d188bdade7:~# hostname gcloudroot@gcloud-seoul-5d188bdade7:~# hostnamegcloudColored by Color Scriptercs 호스트네임 영구 변경1234567891011root@gcloud-seoul-5d188bdade7:~# hostnamectl set-hostname gcloudxroot@gcloud-seoul-5d188bdade7:~# hostnamectl Static hostname: gc..
우분투에 pgAdmin 설치하기 How To Install pgAdmin on Ubuntu 14.04
2017. 11. 18.우분투에 pgAdmin 설치하기How To Install pgAdmin on Ubuntu 14.04 시스템 패키지 업데이트 완료, 관련 패키지 설치완료, 그리고 가상환경 설치까지 마쳤다고 가정하고 진행합니다. Installing PGAdmin 4가상환경을 활성화하여 PgAdmin 파이썬 휠을 다운로드한다.12345678910111213141516171819 root@localhost:~# source venv/bin/activate(venv) root@localhost:~# wget https://ftp.postgresql.org/pub/pgadmin/pgadmin4/v1.6/pip/pgadmin4-1.6-py2.py3-none-any.whl--2017-11-18 15:35:29-- https://ftp..
우분투 14.04에 PostgreSQL 설치하기 How To Install and Use PostgreSQL on Ubuntu 14.04
2017. 11. 18.How To Install and Use PostgreSQL on Ubuntu 14.04 Installation우분투의 기본 저장소는 Postgres 패키지를 포함하고 있으므로, apt 패키징 시스템을 이용해서 설치할 수 있다. 로컬 apt 저장소를 업데이트하지 않았으므로, 먼저 apt 저장소를 업데이트한다. Postgres 패키지와 "contrib" 패키지를 가지고 와서 설치한다.123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596..