let rec์ ๊ฒฐ๊ตญ ๊ตฌํํ๊ณ ํ์ ์ ์ด ์ ์ด์ํ์ง๋ง ์ผ๋จ ์ฝ๋์ ์ด ์ผ์ถ ๋๊ณ ์๋ค.... (TS Output)
isEven(S(O)) == false
isEven(S(S(O)) == true
!!!!!
@ranolp@hackers.pub ยท 41 following ยท 60 followers
FunApp
(ฮ โข ๐: Humor โ Happy, ๐ : Humor) / (๐ ๐ : Happy)
let rec์ ๊ฒฐ๊ตญ ๊ตฌํํ๊ณ ํ์ ์ ์ด ์ ์ด์ํ์ง๋ง ์ผ๋จ ์ฝ๋์ ์ด ์ผ์ถ ๋๊ณ ์๋ค.... (TS Output)
isEven(S(O)) == false
isEven(S(S(O)) == true
!!!!!
์ฅ๊ณ ๋์ ๊ฒฐ๋ก ์ Lumo IR์ let-rec์ ์ถ๊ฐํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค.
์ผ์ด์ด ๋ ๋ธ๋ฃจ์ธ ์ธ๋ฑ์ค ์ํด์ ๋งํ๋ค
์ด์ Lumo (GitHub)์์ fixpoint๋ฅผ ๋ฐํ์ผ๋ก ์ํธ ์ฌ๊ท ๊ฐ๋ฅํ ํจ์ ๋ฌถ์์ ์ ์ํ ์ ์๋ค. ์ฌ์ฌ MVP์ ๋์ด ๋ณด์ธ๋ค. ๋ค์ ์คํ ์ ์ฝ๋์ ์ด๋ค.
์ค๋์ ์ง์
fixpoint <- (
fn[A](f: thunk (A -> produce A)): produce A {
g <- produce (thunk (
fn(x: ฮผX. thunk (X -> produce A)): produce A {
ret <- (force unroll x)(x);
(force f)(ret)
}
));
(force g)(roll g)
}
);
fixpoint_ <- fixpoint[Unit];
(force fixpoint_)(thunk (fn(m: _): _ {
`Unit/unit {}
}))
๋ ์ด์ ํ์ ๊ฒ์ฌ๊ธฐ๋ฅผ ํต๊ณผํ๋ค!
occurs check๋ฅผ ์ ์ง์ ์ฝ๋ฉ์ ์๋ชปํ๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ๋ฌดํ ๋ฃจํ๋ฅผ ๋๋ค. unification ์ด๋ ต๋ค...
unification์ด global๋ก ๋์์ผ ํ๋ค๋ ์ด์ ๋ฅผ ์ด๋์ ๋ ์ดํดํ๋ค ๊ตฌ์์ Algorithm W ๋์
์ค์ ๋ก ํ์๋ฅผ ์ง๊ณ ์๋ค.
Y = forall A. ฮปf.
let g = thunk (ฮปx. (force f) ((force (unroll x)) x)) : thunk ((ฮผX. thunk (X -> A)) -> A)
in g (roll g : ฮผX. thunk (X -> A))
๋ฅผ ํ์ ๊ฒ์ฌํ ๊ฒ ์ง๋ ์ผ์ด์๋ค.
(Y[ฮปโจ isEven: nat -> bool, isOdd: nat -> bool โฉ]) (ฮปm.
ฮปโจ
isEven: ฮปn. match n {
Nat.zero as n => return true
Nat.succ as n => return (force m::isOdd) (n.0)
}
isOdd: ฮปn. match n {
Nat.zero as n => return false
Nat.succ as n => return (force m::isEven) (n.0)
}
โฉ
)
์ด์ ์ ์ฝ๋๋ฅผ ๋์ถฉ ํ์ ๊ฒ์ฌํ ์ ์๋ ๊ฑฐ ๊ฐ๋ค.
์ด์ ์๋งจํฑ์ ํ์ํ ๋งํผ ๊ตฌํํ์ผ๋ ๋๋์ด ์ ํ์ค๋ ์ฝ๋์ ์ผ๋ก ๋์ด๊ฐ ์ ์๊ฒ ๋ค.
์ฌ๊ท ๊ตฌํ์ ์ํด Y combinator๋ฅผ ์ฌ๋ฐ๋ฅธ ํญ์ผ๋ก ์ ์ธํ ์ ์๊ฒ ํ์ ๊ฒ์ฌ๊ธฐ๋ฅผ ๊ณ ์ณค์ผ๋ TyApp์ด ๊ตฌํ๋์ด ์์ง ์์ ์ํ๊น๊ฒ๋ ์คํํ ์ ์๋ค. ์ฌํ ์ผ์ด๋ค.
match ์ง๋ฉด์ unification ๊ตฌํํ๋๋ฐ ์ด๊ฑฐ ์ ์ง๊ธฐ ์ด๋ ต๊ธด ํด๋ณด์ธ๋ค
thunk (fn(x : Nat): MaybeNat {
match(unroll(x)) {
case Nat.zero as x -> return MaybeNat.nothing
case Nat.succ as x -> let y = x.0 in return MaybeNat.just(y)
}
})
๋ฅผ Lumo๋ก ํ์ ๊ฒ์ฌํ ์ ์๊ฒ ๋์๋ค. sub1์ด๋ผ๋ ์ด๋ฆ์ ๋ถ์ผ ์ ์๋ ํจ์๋ค.
ํ๊ฐ ๊ท์น์ด ์ ์ ์ด์ํด์ง๊ณ ์๋ค.
๊ฒฐ๊ตญ AST๋ฅผ ์ง๊ณ Name Resolution์ ํ ๋ค์์ AST Lowering์ ํด์ IR์ ๋ง๋ค์ด์ผ ํ ์ด๋ช ์ธ๊ฐ๋ณด๋ค
Perceus ๋ ผ๋ฌธ์ ๋ค์ ์ฝ๊ณ ์๋ค. ๋ค ์ฝ์ผ๋ฉด ์์ฝ ์ ๋ฆฌํด์ ํด์ปค์คํ์ ๊ธ ํ๋ฒ ์ฌ๋ฆด ๋ฏ ํ๋ค.
ํ์ํ ๋๋ฌด ์ด๋ ต๋ค
๋๋ค ํจ์์ Introduction Rule๊น์ง ์์ฑํ๋ค.
์ง๊ธ ํ์ ๊ฒ์ฌ ๋๋ ๊ฑฐ:
() : ()Nat.zeroNat.succ(Nat.zero)Nat.succ(Nat.succ(Nat.zero))Nat.zero : Natthunk (ฮปx. return ()) : thunk (() -> ())swap :: State a (State a ()) ๊ฐ์ ํจ์๋ฅผ algebraic effect๋ก ๊ธฐ์ ํ๋ ค๋ฉด ๊ฐ์ ํจ๊ณผ๊ฐ ๋๋ฒ ๋์ค๊ธฐ์ koka๋ named handlers๋ฅผ ์คํํ๊ณ ์๋ค.
์ณ์ ๋ฐฉํฅ์ด๋ผ๊ณ ์๊ฐํ๋ค. ๊ธฐ์กด์ koka๋ masked effect๋ผ๋ ๋ณต์กํ ๊ฐ๋
์ ์ฌ์ฉํด outer effect์ ์ ๊ทผํ๋ค.
fun swap-with-mask() : <state<a>, state<a>> () {
val inner-val = get() // innermost
val outer-val = mask<state<a>> { get() } // skip the innermost
set(outer-val) // innermost
mask<state<a>> { set(inner-val) } // skip the innermost
}
ํ์ง๋ง named handler์ ํจ๊ป๋ผ๋ฉด ์ด๋ ๊ฒ ์ธ ์ ์๋ค
fun swap-with-named-handlers(h1, h2) : <state<a>> () {
val val1 = perform get() at h1
val val2 = perform get() at h2
perform set(val2) at h1
perform set(val1) at h2
}
Call-by-Push-Value๋ฅผ ๋ค์ ๋ฐฉ๋ฌธํ๊ณ ์๋๋ฐ ์๋ฌธ์ด ๋ ๋์ง ์์...
์ tag๋ฅผ ์ผ๊ธ ์๋ฏผ์ผ๋ก ๋ง๋ค๊ณ ์๋น ๋ฐฉ๋ฒ์ (1) ์์กดํจ์ ฮ _iโI Bแตข (2) ๊ตฌ๋ถ ํฉ ฮฃ_iโI Aแตข ์ด๋ ๊ฒ 2๊ฐ๋ ๋ง๋ค๊ฒ ํ์ง
ํ์ ๊ฒ์ฌ๊ธฐ ์ถ๋ ฅ์ ๊ฐ์ ํ๋ค. ์์ง Introduction Rule๋ฐ์ ์๊ธฐ ๋๋ฌธ์ Pfenning Recipe๋ฅผ ๋ฐ๋ผ์ ๋ชจ๋ check ๊ท์น์ด๋ค.
x : A๋ฉด inl x๋ ์์์ B์ ๋ํด A + B๋ก ๊ฒ์ฌ๋ ์ ์๋ค
ํ
v : unroll ฯ โน roll v : ฯ
๋ญ๊ฐ ๋น์ฐํ๋ค๋ฉด ๋น์ฐํ๊ธด ํ๋ฐ ํ ์ฌ๋ฐ๋ค
์ด์ ํ์ ๊ฒ์ฌ๊ธฐ ์ง๋ ๋ฐ์๋ ์ต์ํด์ง๊ณ ์๋๋ฐ ๊ฒ์ ์ดํ์ ํ์ ์ ๋ณด๋ฅผ ์ด๋ป๊ฒ ์ฝ๋ ์์ฑ ๊ณผ์ ์์ ์ ์ฉํํ๋์ง ๋ชจ๋ฅด๊ฒ ๋ค
Higher-Rank Polymorphism์ด ์์ด์ผ ํ๋๊ฐ์ ๋ํด ๊ณ ๋ฏผํ๋ ์ค ์์ผ๋ฉด unification ๊ตฌํ์ด ๊ท์ฐฎ์์ง๋ค๋ ๊ฑฐ ๊ฐ์๋ฐ
ํด์ปค์คํ์ ํ์ด์ง ๋งจ ์๋ก ๋ฒํผ์ด ์์ผ๋ฉด ์ข๊ฒ ๋ค
Higher-Order Abstract Syntax๊ฐ ์ ์ ์ฉํ์ง ์ดํด๋ณด๊ณ ์๋๋ฐ ์์ง์ ์ ๋ชจ๋ฅด๊ฒ ๋ค ๋ฉํ ์ธ์ด์ ๋์ ์ธ์ด๊ฐ ์๋ค๋ถํฐ ๊ธฐ๊ธฐ๋ฌ๋ฌํ๋ฐ
์ ๋ณด ๋ฆฌํฐ๋ฌ์ ๊ด๋ จ ์๊ฒฌ์ ๋ณด์กดํ๋ฌ ์๋ค. ์ฐ๋ฆฌ๋ ํํ ์์ด ์๋ฃ๊ฐ ํ๊ตญ์ด ์๋ฃ๋ณด๋ค ๋ซ๋ค๋ ๋ฌธํ์ฌ๋์ฃผ์์ ์๊ฒฌ์ ๊ณต๊ฐํ๊ณค ํ๋ค. ํ์ง๋ง ์ฌ๊ธฐ์ ์จ์ ์๊ฒฌ์ด ์ฌ๋ฟ ์๋ค. ํ๋์ฉ ๊น๋ณด๋ฉฐ ์๋ฏธํด๋ณด์.
์์ด ์๋ฃ๋ ํ๊ตญ์ด ์๋ฃ๋ณด๋ค ๋ซ๋ค. => ์ ๋์๊น? ๋์์ด ๋๊ธฐ ๋๋ฌธ์. ์ ๋์์ด ๋ ๊น? => (์ง์ค์ ๊ฐ๊น๊ธฐ ๋๋ฌธ์, ๋ค์ํ ๊ฒฝํ์ด ์ ์๋์ด ์๊ธฐ ๋๋ฌธ์). ์ ์ง์ค์ ๊ฐ๊น์ธ๊น? => 1์ฐจ ์ถ์ฒ์ ๊ฐ๊น๊ธฐ ๋๋ฌธ์. ์ 1์ฐจ ์ถ์ฒ์ ๊ฐ๊น์ธ๊น? => ์ฌ์ฉ์๊ฐ ๋ค์์ด๊ธฐ ๋๋ฌธ์ ์ง์ ์ฌ์ฉํ๊ฑฐ๋ ๋ฒ์ญ๋์ด 2์ฐจ ์ถ์ฒ๋ก ๊ธฐ๋ฅํ๊ธฐ ๋๋ฌธ์. ์ ๋ค์ํ ๊ฒฝํ์ด ์์๊น? => ์์ฐ์๊ฐ ์๋ฃ ์์ฑ ์ ์์ด๋ฅผ ์ ํํ ํ๋ฅ ์ด ํ๊ตญ์ด๋ณด๋ค ๋๊ธฐ ๋๋ฌธ์.
๊ทธ๋ ๋ค๋ฉด ์ฐ๋ฆฌ๋ ์์ด ์๋ฃ๊ฐ ๋์ ์ด์ ๋ฅผ ๊ตฌ์ฒด์ ์ผ๋ก ํํํ ์ ์๋ค.
ํ์ ๊ณต๊ฐ์ ๋ํ๊ณ , ์ ๋ณด ์ ํ ๊ณผ์ ์์์ ์๊ณก์ ์ค์ด๊ธฐ ์ํด์ ์์ด ์น ํ์์ด ํจ๊ณผ์ ์ด๋ค. ๋ค๋ง ์์ด ์น์ด "์ธ์ ๋" ์ข์ ๊ฑด ์๋๋ค. ํ์ปด์คํผ์ค ์๋ฃ๊ฐ ๋ฏธ๊ตญ์ ๋ง๊ฒ ๋๊ฐ, ์๋๋ฉด ํ๊ตญ์ ๋ง๊ฒ ๋๊ฐ? 1์ฐจ ์ถ์ฒ์ ๊ฐ๊น์ด ๊ณณ์ ํฅํด ์๊ณก์ ์ค์ด๊ณ , ๊ทธ ์์์ ํ์ ๊ณต๊ฐ์ ์ต๋ํ ํจ์จ์ ์ผ๋ก ๋ํ์ผ ํ๋ค.
์์ด ๊ฒ์์ด๋ผ๋ ํผ์์ ์ธ ํ์์์ ๋ฒ์ด๋ ์ ๋ณด ํ์์ ๋ณธ์ง์ ์ข๋ ๊ฒ์ด ์ข๋ค.
์ค๋๋ง์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ์ด์ผ๊ธฐํ๋ฌ ์๋ค. ์ค๋ ์ฃผ์ ๋ ํ์ ์คํฌ๋ฆฝํธ์ ํต์ฌ ๊ฐ์น๋ค.
๋ง์ ์ฌ๋๋ค์ด ์ ์ ํ์ ์ธ์ด๋ฅผ ๋์ ํ๋ ์ด์ ๋ก ์์ ์ฑ(Soundness)๋ฅผ ์ด์ผ๊ธฐํ๋ค. ๋ง๋ ๋ง์ด๋ค. ํ์ง๋ง ํ์ ์คํฌ๋ฆฝํธ์์ ์์ ์ฑ์ 2๋ฑ ๊ฐ์น๋ค. ๊ทธ๋ผ 1๋ฑ ๊ฐ์น๋ ๋ญ๊น?
๋ฐ๋ก ๊ฐ๋ฐ ๊ฒฝํ ๊ฐ์ ์ด๋ค. ๊ตฌ์ฒด์ ์ผ๋ก, ์ค๋ฅ ๋๊ธฐ ์ฌ์ด ๊ตฌ๋ฌธ์ ์ ๋นํ ์ค์ด๊ณ ์๋ ์์ฑ์ ๊ฐ์ ํ๋ฉฐ ํฐ ๊ท๋ชจ ๋ฆฌํฉํ ๋ง ์ ์ฌ๋ฆฌ์ (๊ทธ๋ฆฌ๊ณ any ๊ฐ์ ๊ธฐ๋ฅ์ ์ ์ผ๋ค๋ ๊ฐ์ ํ์ ๋ฐํ์์๋ ์ ์๋ฏธํ ์์ค์) ์์ ์ฑ์ ์ป๊ฒ ๋ค๋ ๊ฑฐ๋ค.
ํ์ ์คํฌ๋ฆฝํธ ๊ณต์ ์ํค ๋ฌธ์์๋ ์์ ์ฑ์ ๋ชฉํ๊ฐ ์๋๋ผ๊ณ ๋์์๋ค (#). ์ฐ๋ฆฌ๋ ๋๋๋ก ๋๊ตฌ์ ๋ชฉ์ ์ ๋ค์ด๋ง์ง ์๋ ๋ถํ์ํ ๊ธฐ๋๋ฅผ ํ๊ณค ํ๋ค. ํ์ง๋ง ๋๊ตฌ ๊ฐ๋ฐ์์ ์ธ์ฐ๋ ๊ฑด ์ฌ์ฉ์๋ก์ ์ข์ ์ ๋ต์ด ์๋๋ค.
์กฐ๊ฑด๋ถ ํ์ ๊ณผ ์ฌ๊ท ํ์ , ํ ํ๋ฆฟ ๋ฌธ์์ด ํ์ , infer ๋ฑ์ ๋ณด๋ผ. ์ ์ ๋ถ์ ๋์ด๋๊ฐ ์ง์์ ์ผ๋ก ์ฌ๋ผ๊ฐ๋ ํฌํํ ๊ธฐ๋ฅ๋ค์ด ์ธ์ด์ ๊ณ์ ์ถ๊ฐ๋๋ ์ด์ ๊ฐ ๋ฌด์์ธ๊ฐ. ์ถ๋ก ์ ํฌ๊ธฐํ๊ณ any๊ฐ ๋์ค๊ณค ํ๋ ์ด์ ๊ฐ ๋ฌด์์ธ๊ฐ.
๊ทธ๋ค์ด ์ถ๊ตฌํ๋ ๊ฒ ์์ ํ ์ธ๊ณ๊ฐ ์๋ ์ค์ฉ์ ์ธ ์ธ๊ณ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๋: ๊ฑด์ ํ ์ก์ ์ ๊ฑด์ ํ ์ ์ ์ด ๊น๋ ๋ค(Sound body โ Sound mind) โ ๊ฑด์ ํ์ง ์์ ์ ์ ์ด๋ผ๋ฉด ์ก์ ๋ ๊ฑด์ ํ์ง ์๋ค (ยฌSound mind โ ยฌSound body)
@: ๋น์ ์ ๋ช ์ ์ ๋์ฐ์ ์ฐธ๊ฐ์ด ๊ฐ๋ค๋ ์ฃผ์ฅ์ ํ๋ฉฐ ๋ฐฐ์ค๋ฅ ์ ๊ฐ์ ํ๊ณ ๋ง์์ต๋๋ค!!
๋: ์ ์ง์ฆ๋
๋ญ๋ผ๋ ๊ฑฐ์์ฌ
We eventually end up with constraints of the shape โ
โ and there always exists a and such that we can reduce the constraint to an equivalent constraint .โ (Parreaux and Chau, 2022, p. 10)
์ Ctrl + Enter๋ก ์ฌ๋ฆฌ๊ธฐ ๋๋๊น ๋๋ฌด ํธํ๋ค ์ด๊ฒ SNS์ง
MLstruct ์ฝ๊ณ ์๋๋ฐ ๋คํ์ค๋ฝ๊ฒ๋ Simple-sub ๊ธฐ๋ฐ์ด๋ผ๊ณ ํ๋ค. MLsub ๊ธฐ๋ฐ์ด์์ผ๋ฉด MLsub ์ฝ์ผ๋ฌ ๊ฐ์ผ ํด์ ์ธ์์
@cog25 ๋์ ์ด๋ํ๋ค ํํ
์ด๋ฐ ๋ฉด์์ KDL์ด ์์ฃผ ํ๋ฅญํ๋ค๊ณ ๋๊ผ๋ ๊ฒ /- ์ฃผ์์ด๋ ๊ฒ ์๋ค. AST ๋ ธ๋ ํ๋๋ฅผ ์ฃผ์ ์ฒ๋ฆฌํ๋ ๊ฑฐ.
#์๊ธฐ์๊ฐ ๋ฅผ ํด๋ณผ๊น์.
ํจ์ํ ์ธ์ด๋ ๋ญ ์ฌ์ค ์ญ์ฌ์ ์ ํต์ ๋ฆฌ์คํ ๋ฐฉ์ธ์์ ์์ํด์ผ ํ์ง ์๋ (์์)
๋ชจ๋ฐ์ผ ์น์ ๊ทธ๋ฅ ์๋ก ๋์์ธํ๋ ๊ฑธ ๊ฐ์ธ์ ์ผ๋ก ์ ํธํ๋ค. ๋ด๋น๊ฒ์ด์ ๋ฐฉ๋ฒ์ด ๊ฝค๋ ๋ฌ๋ผ์ (๋ฐํ ํญ ๋ด๋น๊ฒ์ด์ ๋ฑ)
์๊ธฐ์๊ฐ ๊ฐ์ก๊ณ ์ฐ๊ธฐ ๊ท์ฐฎ์
~๋ถ์ ๋ถ๋ถ์ ๋๋ฌ์ผ ์ค๋ ๋ ์๋ก ํ์์ด ๊ฐ๋ฅํ๋ฐ ๊ทธ๋ฅ ํธ์ํฐ์ UX๋ก ์์ชฝ ํธ์ ์์ญ ์ ์ฒด๊ฐ ์ค๋ ๋ ์๋ก ํ์ ๊ธฐ๋ฅ์ด๋ฉด ์๋๋
2022๋ ๋ ผ๋ฌธ์ด๋ฉด very new thingy์ฃ
๋๋์ด ๊ธฐ๋ณธ ํ์ ์ถ๋ก ์์ด๋์ด๋ฅผ ์ผํํ ์ ์๋ค
MLstruct ๋ ผ๋ฌธ์ ์ฝ์ด์ผ ํ๋๋ฐ ๋๋ฌด ๊ท์ฐฎ๋ค... Simple-sub ๋ ผ๋ฌธ์ Scala ์ฝ๋ ์ค์ ์ฝ๊ณ ๊ตฌํํ๊ธฐ ์ฌ์ ๋จ ๋ง์ผ
ํธ์ํฐ๋ ํธ์น์๊ณ ๋ธ๋ฃจ์ค์นด์ด๋ ๋ธ์น์๋๊น ํด์ปค์คํ์ ํด์น์ ๋ด์ง๋ ํ์น์๊ฒ ๊ตฐ
์ฌ๋ ํ์ฌ/๋๋ค์์ ํธ๋ฒํ์ ๋ ํธ๋ฒ ์นด๋ ์๋์ค๋ ๊ฑฐ ์๊ทผ ๋ถํธํ๋ค ์ด๊ธฐ ํ๋ก์ฐ ๊ด๊ณ ๋น๋ฉํ ๋ ํ์๋ผ์ธ ๋ณด๋ฉด์ ์ฌ๋ฐ์ด๋ณด์ด๋ ์ฌ๋ ๋ณด์ด๋ฉด ์ฆ์ ํธ๋ฒ ์นด๋์์ ํ๋กํ๋ฉด ํธํ๋ฐ
์ ctrl + enter ๋๋ฌ๋ ์ ์ฌ๋ผ๊ฐ์ง....
๋ฒจ๋ก๊ทธ์ draft๋ก ๋จ๊ฒจ๋๋ ๋ ผ๋ฌธ ์์ฝ+๋ฒ์ญ ํฌ์คํธ๋ฅผ ์ด๋ ค์ ์ฌ๊ธฐ๋ค๊ฐ ์ฌ๋ฆฌ๋ฉด ๊ด์ฐฎ์ผ๋ ค๋
ํด์ปค์คํ์ PWA๋ก ์ค์นํ๋๊น ๋ค๋ก๊ฐ๊ธฐํ๋ฉด ์ฑ์ ์ดํํด๋ฒ๋ ค์ ๊ณค๋ํ๋ค
์ฌ๊ธฐ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ์ด์ผ๊ธฐ๋ ํด์ผ๊ฒ ๋ค