applicative order / normal order 공부하다가 질문함.
- 하스켈(ghci)
> let func1 = func1
> func1
- LISP
> (define (func1) (func1))
> (func1)
둘 다 이렇게 하면 무한재귀가 되는데, F# 비롯한 ML 계열에서는 이거 어떻게 할 수 있음?
let rec func1 = func1 <- 이렇게 해도 안 되던데
applicative order / normal order 공부하다가 질문함.
- 하스켈(ghci)
> let func1 = func1
> func1
- LISP
> (define (func1) (func1))
> (func1)
둘 다 이렇게 하면 무한재귀가 되는데, F# 비롯한 ML 계열에서는 이거 어떻게 할 수 있음?
let rec func1 = func1 <- 이렇게 해도 안 되던데
그냥 안되면 tail call을 하는 특별한 문법이 있을지도
let rec func1 () = func1 () 아닐려나
let rec func1 ():unit = func1 () 이렇게 하니까 재귀됨 ㄳㄳ. 근데 unit을 인자로 받는데, 인자 없이는 불가능한건가?
Ml계열은 lazy eval안해서 그럼
근데 예시로 든 LISP도 lazy eval 아닌 걸로 알고있는데? 그럼 ml도 가능하지 않을까??
좀 더 생각해봤는데, lisp은 동적타입이고 ml계열은 정적타입이니까 타입체커에서 막힐 수도 있겠다.
let rec func1 ():unit = func1 () <- 여기서 unit 타입 어노테이션 빼면 재귀 못함.