gpt4 book ai didi

haskell - 如何在递归函数中使用 Control.Monad.Cont?

转载 作者:行者123 更新时间:2023-12-02 00:22:47 37 4
gpt4 key购买 nike

我正在为 this question 提供答案我想到了使用 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)。请记住,函数应用程序的绑定(bind)比任何中缀运算符都要紧密。

(也常见写成return $a + b,其实是一回事)

关于haskell - 如何在递归函数中使用 Control.Monad.Cont?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54849064/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com