idris

어떤 언어인가

  • 타입 주도 개발(type driven development)을 위해 개발됨
  • 타입이 1급 구조(first-class constructs)임
    • 문자열, 정수 등의 값처럼 타입을 다룰 수 있음
    • 함수에 인자로서 전달될 수 있음
    • 함수가 반환할 수 있음

기본 도구와 생태계

  • idris — 컴파일러이자 REPL이자 타입 분석 도구

REPL에서

The Idris REPL — Idris 1.3.3 documentation

  • :module <module name> — 모듈 불러오기
  • :l <file name> — 파일 불러오기
  • :t <expr> — 타입 확인하기
  • :r — 다시 불러오기
  • :t — 값 바인딩하기

기본 자료구조

  • 수: Int, Integer, Double
  • 문자: Char, String
  • 포인터: Ptr
  • 부울: Bool, True, False
  • 타입: Type

표현문의 끝은 들여쓰기로 구분한다. 값의 타입 지정과 선언은 아래와 같이 한다. 하스켈과 다르게 타입 지정을 :로 하고, 리스트 연결을 ::로 한다.

x : Int
x = 3

idris로 작성한 자연수 타입 Nat와 리스트 타입 List의 선언은 아래와 같다:

data Nat = Z | S Nat
data List a = Nil | (::) a (List a)

의존 타입

보통의 언어들은 타입 선언에서는 타입만 다룰 수 있고, 함수의 몸체에서는 값만 다룰 수 있다. idris의 타입은 1급 시민으로, 값과 차이 없이 다룰 수 있다. 인자로도 받을 수 있고, 함수가 반환도 할 수 있다. 아래의 예시에서 대문자로 시작하는 것들은 모두 타입이다.

isSingleton : Bool -> Type
isSingleton True = Nat
isSingleton False = List Nat

이렇게 정의한 함수를 다시 타입 선언에 활용할 수도 있다. 아래의 예시에서는 위에서 정의한 isSingle 함수를 이용하여 경우에 따라 다른 타입을 반환한다.

mkSingle : (x : Bool) -> isSingleton x
mkSingle True = 0
mkSingle False = []
  • 타입 선언은 컴파일 타임에 실행되며, 프로그램의 검증을 위해 쓰인다.
  • 함수 몸체는 런타임에 실행되며, 프로그램의 동작을 위해 쓰인다.

이렇게 보는 게 편할 것 같다.