Coalton 0.2 프리뷰: 커링을 버리고, 키워드 인자와 실수 대수적 수를 품다
요약
기사 전체 정리
고정 인자(fixed arity) 함수 — 커링을 버리다
Coalton은 Common Lisp 안에 사는 정적 타입 함수형 언어인데, 0.2 버전 프리뷰에서 꽤 큰 변화들을 공개함. 가장 큰 건 Haskell 스타일 커링을 버리고 고정 인자 함수로 전환한 것
기존에는
(define (f x y z) (+ x (* y z)))의 타입이Num :a => :a -> :a -> :a -> :a여서(f 1)이나(f 1 2)같은 부분 적용이 자유롭게 가능했음. 이게 Coalton의 정체성 같은 거였는데 과감하게 바꿈바꾼 이유가 실용적임:
- API 설계가 "부분 적용하기 편한 순서"에 끌려다니는 문제 해소
- 클로저 할당이 암묵적으로 발생하는 문제 해결
- 인자 수를 잘못 넣으면 타입 에러가 엉뚱한 데서 나오던 게 이제 호출 시점에서 바로 잡힘
- 키워드 인자, 옵셔널 인자 등 풍부한 호출 규약의 기반이 됨
재밌는 건 이 스위치를 켰을 때 99%의 코드가 그대로 컴파일됐고, 타입 시그니처만 깨졌다는 것. 커링 스타일이 실제로는 거의 안 쓰이고 있었다는 증거
키워드 인자와 다중 반환값
고정 인자 덕에 키워드 인자가 자연스럽게 들어옴. 예:
(open "data.csv" :direction Output :if-exists Supersede)— 디폴트값이 있고 호출 시 선택적으로 오버라이드 가능다중 반환값(multiple value returns)도 네이티브로 지원됨. 기존에는 Tuple을 반환하고 컴파일러가 heuristic하게 언박싱했는데, 이제
(values ...)형태로 명시적 다중 반환을 하고let (values a b) = ...로 받음Unit과Void의 역할도 재정의됨. 이제 인자가 없는 함수는Void -> ..., 반환값이 없는 함수는... -> Void타입을 가짐
컬렉션 리터럴과 컴프리헨션
드디어
[1 2 3]같은 컬렉션 리터럴 문법이 생김.FromCollection타입 클래스를 구현한 모든 타입에 오버로딩됨.["hello" => 1 "world" => 2]같은 연관 컬렉션 문법도 지원컴프리헨션도 됨:
[name => i for i in (up-to 10) with name = (number-name i)]이런 식으로 HashMap을 선언적으로 생성 가능
짧은 람다 문법과 scoped 타입 변수
커링을 버린 대신 짧은 람다 문법을 도입:
(fn (x) (* x x))를\x.(* x x)로 쓸 수 있음. 오버헤드가\와.단 2글자forall로 스코프 있는 타입 변수 도입.declare에서 선언한 타입 변수를define본문에서 직접 참조 가능해져서, 타입 꼼수 없이 깔끔하게 코드를 작성할 수 있게 됨
실수 대수적 수(Real Algebraic Numbers)
CAD처럼 정확한 수치 비교가 필요한 분야를 위해
RealAlgebraic타입 추가. $\sqrt{2+\sqrt{3}} = \frac{\sqrt{2}}{2}(\sqrt{3}+1)$을 부동소수점 근사 없이 정확하게 증명 가능F32로는 두 값이 같아 "보이지만" 확신 못 하는 문제를,
RealAlgebraic으로 바꾸면(== a b)가 정확한 결과를 반환함. 엡실론 비교 같은 거 필요 없음이런 고급 수학 기능들은 별도 모듈
coalton/xmath로 분리됨. 이원수(dual numbers), 임의 정밀도 부동소수점, 계산 가능한 실수, FFT 등 포함
기타 변경사항
- Hindley-Milner 타입 시스템의 가변성 관련 사운드니스(soundness) 문제를 약한 타입 변수(weak type variables) 도입으로 해결
- 표준 라이브러리 네이밍을
coalton-library/foo에서coalton/foo로 변경 - Coalton 0.2는 2026년 3월 23일 출시 목표였고, 0.3에서는 선형/아핀 타입과 명시적 리소스 관리를 검토 중
댓글
댓글
댓글을 불러오는 중...