์์กด ํ์ ์ผ๋ก ๋ฌดํ ๋๋ฒ๊น ๋ฃจํ ์ ๊ฑฐํ๊ธฐ
Idris2 ์์กด ํ์ ์์คํ ์ ํ์ฉํ AI ๋ณด์กฐ ์ฝ๋ ์์ฑ์ ์ํ ํ๋ก๋์ ๋ ๋ ๋ณด์ผ๋ฌํ๋ ์ดํธ
ํ๊ตญ์ด | English
์์ฐ์ด โ AI โ ์ฝ๋ โ ๋ฒ๊ทธ โ ์์ โ ์ ๋ฒ๊ทธ โ ์์ โ ... โ
์ ํต์ ์ธ AI ์ฝ๋ ์์ฑ์ ๋ฌธ์ :
- โ ๋ชจํธํ ๋ช ์ธ
- โ ์ปดํ์ผ ํ์ ๊ฒ์ฆ ์์
- โ ๋ฌดํ ๋๋ฒ๊น ๋ฃจํ
- โ ์ฃ์ง ์ผ์ด์ค ๋๋ฝ
์์ฐ์ด โ AI โ Idris2 (์์กด ํ์
) โ Python + ํ
์คํธ
โ โ
โโโโโโโ ์ปดํ์ผ๋ฌ โโโโโโโโ
์์กด ํ์ ์ ์ฝ๋ ์์ฑ์ ์ํ ๋ช ์ธ ์ธ์ด๋ก ์ฌ์ฉํฉ๋๋ค.
git clone https://github.com/twoLoop-40/idris2-python-boilerplate.git
cd idris2-python-boilerplate# Idris2 ์ค์น
brew install idris2 # macOS
# ๋๋: https://idris2.readthedocs.io/
# Python ์์กด์ฑ ์ค์น
pip install -r requirements.txtbash .claude/setup_project.sh# ์์ 1: ๊ธฐ๋ณธ ํจ์
cd examples/01_basic
idris2 -o func func.idr && ./build/exec/func
python func.py
pytest test_func.py -v
# ์์ 2: ์์กด ํ์
cd ../02_dependent_types
idris2 -o safelist SafeList.idr && ./build/exec/safelist
python safe_list.py
pytest test_safe_list.py -v # 45๊ฐ ํ
์คํธ, ๋ชจ๋ ํต๊ณผ!์์กด ํ์ ์ผ๋ก ๋ช ์ธ ์์ฑ:
-- ํ์
์ด ๋น์ด์์ง ์์์ ๋ณด์ฅ
safeHead : Vect (S n) a -> a
-- ๋ฒ์๊ฐ ์ ํ๋ ์ธ๋ฑ์ฑ (๋ฒ์ ๋ฒ์ด๋จ ๋ถ๊ฐ๋ฅ!)
safeIndex : Fin n -> Vect n a -> a
-- ํ๋ ฌ ์ฐจ์์ด ํ์
์ ํฌํจ๋จ
matAdd : Matrix r c Int -> Matrix r c Int -> Matrix r c Intํ์ ์ด ๋ฐํ์ ์ฒดํฌ๋ก ๋ณํ๋จ:
def safe_head(vec: List[T]) -> T:
"""ํ์
: Vect (S n) a -> a"""
assert len(vec) >= 1, "๋น์ด์์ง ์์ ๋ฒกํฐ๊ฐ ํ์ํฉ๋๋ค"
return vec[0]
def mat_add(mat1: Matrix, mat2: Matrix) -> Matrix:
"""ํ์
: Matrix r c Int -> Matrix r c Int -> Matrix r c Int"""
assert mat1.rows == mat2.rows
assert mat1.cols == mat2.cols
# ...ํ์ ์๊ทธ๋์ฒ โ ํ ์คํธ ์ค์ํธ:
# ํ์
์์: Vect (S n)์ ๋น์ด์์ง ์์์ผ ํจ
@pytest.mark.precondition
def test_safe_head_rejects_empty():
with pytest.raises(AssertionError):
safe_head([])
# ํ์
์์: Vect (n + m) โ Vect n
@given(n=st.integers(0, 50), m=st.integers(0, 50))
@pytest.mark.property
def test_length_property(n, m):
vec = list(range(n + m))
result = safe_take(n, vec)
assert len(result) == n์์ 1: ๊ธฐ๋ณธ ํจ์ (์์ธ๋ณด๊ธฐ)
๊ฐ๋จํ ์ํฌํ๋ก์ฐ ๋ฐ๋ชจ:
- Public/private ํจ์
- ๊ธฐ๋ณธ ํ์ ์๊ทธ๋์ฒ
- ์๋ ์์ฑ๋ ํ ์คํธ
์ ํฉํ ๋์: ์ ๋ฌธ์
์์ 2: ์์กด ํ์ (์์ธ๋ณด๊ธฐ)
๊ณ ๊ธ ๊ธฐ๋ฅ ํฌํจ:
- Vect (๊ธธ์ด๊ฐ ์ธ๋ฑ์ฑ๋ ๋ฒกํฐ)
- Fin (๋ฒ์๊ฐ ์ ํ๋ ์์ฐ์)
- ์ฐจ์ ์ถ์ ์ด ์๋ ํ๋ ฌ ์ฐ์ฐ
- 45๊ฐ ์๋ ์์ฑ ํ ์คํธ (100% ํต๊ณผ)
์ ํฉํ ๋์: ์์กด ํ์ ์ ๊ฐ๋ ฅํจ ์ดํดํ๊ธฐ
cp -r idris2-python-boilerplate ~/my-project
cd ~/my-project
bash .claude/setup_project.shcd /path/to/your/project
cp -r idris2-python-boilerplate/.claude .
bash .claude/setup_project.sh.claude/project_config.yaml ํธ์ง:
project:
name: "MyProject"
target:
language: "python" # ๋๋ typescript, rust
domain_types:
UserId:
python: "uuid.UUID"
EmailAddress:
python: "pydantic.EmailStr"-- src/UserValidation.idr
data ValidUser : Type where
MkValid : (email : Email)
-> (age : Nat)
-> {auto prf : age >= 18}
-> ValidUser/convert src/UserValidation.idr
# generated/python/user_validation.py
@dataclass
class ValidUser:
email: str
age: int
def __post_init__(self):
assert '@' in self.email
assert self.age >= 18
# generated/tests/test_user_validation.py
def test_underage_rejected():
with pytest.raises(AssertionError):
ValidUser("test@example.com", 17)- โ ์ ํํ๊ณ ๋ช ํํ ๋ช ์ธ
- โ ์ฆ๊ฐ์ ์ธ ์ปดํ์ผ๋ฌ ํผ๋๋ฐฑ
- โ ๋๋ฒ๊น ์ฌ์ดํด ๋ํญ ๊ฐ์
- โ ์ฃ์ง ์ผ์ด์ค ์๋ ๋ฐ๊ฒฌ
- โ ํฌ๊ด์ ์ธ ๋ฐํ์ ์ฒดํฌ
- โ ์์ฒด ๋ฌธ์ํ ์ฝ๋
- โ ๋์ ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง (์๋ ์์ฑ)
- โ ์ฆ๋ช ๊ฐ๋ฅํ ์ ํ์ฑ ์์ฑ
- โ ๋ ๋น ๋ฅธ ๋ฐ๋ณต
- โ ๋ ๋์ ์ ๋ขฐ๋
- โ ๋ ์ฌ์ด ๋ฆฌํฉํ ๋ง
- โ ๋ ๋์ ์ ์ง๋ณด์์ฑ
์ด์ (์ ํต์ AI ์์ฑ):
๋ช
์ธ ์์ฑ (๋ชจํธํจ) โ AI๊ฐ ์ฝ๋ ์์ฑ โ ๋ฒ๊ทธ ๋ฐ๊ฒฌ
โ AI๊ฐ ๋ฒ๊ทธ ์์ โ ์ ๋ฒ๊ทธ ๋ฐ์ โ AI๊ฐ ์์ โ ์๋ ๋ฒ๊ทธ ์ฌ๋ฐ
โ 10+ ๋ฐ๋ณต โ ์ฌ์ ํ ๋ฒ๊ทธ ์์
์ดํ (ํ์ ์ฃผ๋ ์์ฑ):
Idris2 ํ์
์์ฑ (์ ํํจ) โ ์ปดํ์ผ๋ฌ ๊ฒ์ฆ โ Python + ํ
์คํธ ์์ฑ
โ ํ
์คํธ ํต๊ณผ โ 1-2 ๋ฐ๋ณต๋ง์ ์๋ฃ
๋๋ฒ๊น ์๊ฐ ๊ฐ์: ~80%
- ๋ณต์กํ ๊ฒ์ฆ์ด ์๋ ๋น์ฆ๋์ค ๋ก์ง
- ๋ฐ์ดํฐ ๋ณํ ํ์ดํ๋ผ์ธ
- ์๊ฒฉํ ๊ณ์ฝ์ด ์๋ API
- ์์ ์ด ์ค์ํ ์ฝ๋
- ๋ ๊ฑฐ์ ์์คํ ๋ฆฌํฉํ ๋ง
- ํ๋กํ ํ์ /์ผํ์ฉ ์ฝ๋
- ๋จ์ํ CRUD ์์
- UI/ํ๋ ์ ํ ์ด์ ๋ ์ด์ด
- ์์ ๊ฐ์ด๋ - ์๋ํ๋ ์์ ์์ ๋ฐฐ์ฐ๊ธฐ
- ํ ํ๋ฆฟ ์ค์ - ํ๋ก์ ํธ์์ ์ด ๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฌ์ฉํ๊ธฐ
- ์ ์ฒด ๋ช ์ธ - ์์ ํ ๋ฐฉ๋ฒ๋ก
- ํ๋ก์ ํธ ์ค์ - ์ปค์คํฐ๋ง์ด์ง ์ต์
๊ธฐ์ฌ๋ฅผ ํ์ํฉ๋๋ค! ํนํ:
-
์๋ก์ด ์์
- Web API ๊ฒ์ฆ
- ํ์ ์ฝค๋น๋ค์ดํฐ
- ์ํ ๊ธฐ๊ณ
- ๋น์ฆ๋์ค ๋ฃฐ ์์ง
-
ํ๊ฒ ์ธ์ด
- TypeScript ์ง์
- Rust ์ง์
- Java ์ง์
-
๋ฌธ์
- ํํ ๋ฆฌ์ผ
- ๋ชจ๋ฒ ์ฌ๋ก
- ํจํด ๋ผ์ด๋ธ๋ฌ๋ฆฌ
์์ธํ ๋ด์ฉ์ CONTRIBUTING.md๋ฅผ ์ฐธ์กฐํ์ธ์.
๊ฑฐ์ธ์ ์ด๊นจ ์์์ ๋ง๋ค์ด์ก์ต๋๋ค:
- Idris2์ ์์กด ํ์ ์ปค๋ฎค๋ํฐ
- Claude Code AI ๋ณด์กฐ ๊ฐ๋ฐ
- Hypothesis ์์ฑ ๊ธฐ๋ฐ ํ ์คํ
MIT License - ์์ธํ ๋ด์ฉ์ LICENSE ํ์ผ ์ฐธ์กฐ
์์ ์ ๋ฐ ์คํ์์ค ํ๋ก์ ํธ์์ ์์ ๋กญ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
ํ์ ์ฃผ๋ ๊ฐ๋ฐ์ ์ํด โค๏ธ ๋ก ๋ง๋ค์ด์ก์ต๋๋ค
โญ ๋ค์ ํ๋ก์ ํธ๋ฅผ ์ํด ์ด ์ ์ฅ์์ Star๋ฅผ ๋๋ฌ์ฃผ์ธ์!