簡體   English   中英

如何在遞歸函數中使用Control.Monad.Cont?

[英]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
   |   

但這對我來說沒有意義。 為什么我有a2m a2 我期望ab是同一類型。

這讓我很煩,因為同一程序在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM