[英]How to use Control.Monad.Cont in a recursive function?
我提供了這個問題的答案,並且想到了使用Cont
monad的想法。 我對Haskell的了解不足,無法解釋為什么該程序無法正常工作
import Control.Monad.Cont
fib1 n = runCont (slow n) id
where
slow 0 = return 0
slow 1 = return 1
slow n = do
a <- slow (n - 1)
b <- slow (n - 2)
return a + b
main = do
putStrLn $ show $ fib1 10
錯誤-
main.hs:10:18: error:
• Occurs check: cannot construct the infinite type: a2 ~ m a2
• In the second argument of ‘(+)’, namely ‘b’
In a stmt of a 'do' block: return a + b
In the expression:
do a <- slow (n - 1)
b <- slow (n - 2)
return a + b
• Relevant bindings include
b :: a2 (bound at main.hs:9:7)
a :: a2 (bound at main.hs:8:7)
slow :: a1 -> m a2 (bound at main.hs:5:5)
|
10 | return a + b
|
但這對我來說沒有意義。 為什么我有a2
和m a2
? 我期望a
和b
是同一類型。
這讓我很煩,因為同一程序在JavaScript中工作得很好。 也許Haskell需要一個類型提示?
const runCont = m => k => m (k) const _return = x => k => k (x) const slow = n => n < 2 ? _return (n) : slow (n - 1) (a => slow (n - 2) (b => _return (a + b))) const fib = n => runCont (slow(n)) (console.log) fib (10) // 55
return a + b
解析為(return a) + b
,而您想return (a + b)
。 請記住,函數應用程序的綁定比任何infix運算符都緊密。
(寫return $ a + b
也很常見,這等於同一件事)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.