在哈斯克爾,我可能會實現if
這樣的:伊德里斯急於評價
if' True x y = x
if' False x y = y
spin 0 =()
spin n = spin (n - 1)
這行爲我怎麼想到:
haskell> if' True (spin 1000000)() -- takes a moment
haskell> if' False (spin 1000000)() -- immediate
在球拍,我可以實施一個有缺陷的if
像這樣:
(define (if2 cond x y) (if cond x y))
(define (spin n) (if (= n 0) (void) (spin (- n 1))))
這行爲我怎麼想到:
racket> (if2 #t (spin 100000000) (void)) -- takes a moment
racket> (if2 #f (spin 100000000) (void)) -- takes a moment
在伊德里斯,我可能會實現if
這樣的:
if' : Bool -> a -> a -> a
if' True x y = x
if' False x y = y
spin : Nat ->()
spin Z =()
spin (S n) = spin n
這行爲surpris上課我:
idris> if' True (spin 1000)() -- takes a moment
idris> if' False (spin 1000)() -- immediate
我預計Irdis表現得像個球拍,其中兩個參數是 評估。但事實並非如此!
伊德里斯如何決定何時評估事物?
謝謝!我不得不將'spin:Nat - >()'改爲'spin:Nat - > Bool'(我猜Idris意識到'()'只有一個居民,並且優化了對spin的調用),但是在無論「if」分支是哪個分支,可執行文件都花了一些時間運行。 – Snowball
是的,它會清除()。實際上,在當前的主控制器中,它執行了更深的擦除分析,因此您可能必須執行一些操作,比如打印旋轉n的結果以確保評估結果... –
如果知道「旋轉1000」是終止並且沒有副作用,這個表達式不會在編譯時被評估,而是被替換爲生成的代碼中的結果,所以這兩個版本的'if''-line會在運行時立即返回它們的結果? (上面的雪球註釋表明它沒有。) – Lii