리니어 타입 (작성 중)

Posted on December 12, 2022

함수의 결과가 정확히 한 번만 consume 될 때, 함수 인자도 정확히 한 번만 consume되면 그 함수는 리니어하다고 말합니다. 함수가 Sum타입을 패턴 매칭한다든지 해서 여러 실행 경로가 생길 때, 각 경로에서 인자를 딱 한번만 쓰는 걸 말합니다.

GHC 공식 문서 - 6.4.18. Linear types

인자를 한 번만 쓴다.

타입에 “인자를 한 번만 쓴다는 걸” 명시한 타입입니다. 타입 서명에 인자를 딱 한 번만 사용한다고 명시하면, 컴파일러가 서명과 구현을 비교해서 구현이 인자를 두 번 이상 쓰면 컴파일 에러를 뱉습니다. 인자를 한 번만 쓰게 하면 무슨 효과가 있을까요?

“mutation을 안전하게 쓸 수 있습니다.”

리소스를 안전하게 쓰기 위해 타입 체커 도움 받기

mutation을 안전하게 하는 방법으로 아래 두 가지를 들 수 있습니다.

  1. 한 쓰레드 안에서만 사용하며, 이 쓰레드를 벗어나지 않는다.
  2. 한 순간에 하나의 포인터만 mutation값을 가리킨다.

첫 번째 방법을 쓰는 게 ST 모나드이고, 두 번째 방법이 리니어 타입입니다. 두 가지 다 mutation을 안전하게 쓸 수 있다는 걸 타입 레벨에서 보증check하는 방법입니다.

지킬 수 밖에 없게 만들기

(아직 내용 없음)

사용 방법

확장 LinearTypes를 켜면 a %1 -> b, a %m -> b 문법을 사용할 수 있게 됩니다.
a %1 -> b 이렇게 쓰면 a를 한 번만 쓰는 a -> b 타입 리니어 함수란 뜻입니다.

Github 계정이 없는 분은 메일로 보내주세요. lionhairdino at gmail.com