繁体   English   中英

加载一个函数,但 ghci 似乎没有编译它

[英]Load a function but ghci doesnt seem to have compiled it

我以前遇到过这个问题几次,但不确定是什么原因。 我只是简单地关闭命令窗口并重新打开。 例如,我在编译器中输入u并且没有任何反应(不知道如何解释,最好自己尝试一下)。 如果某人可以向我解释问题以及如何解决它,那就太好了!

u = let a = 2
        b = a + (let a = 3
                 in a+b)
    in b*b

你的函数非常荒谬,你知道吗? 让我们做一个小数学,好吗?

module Q54272249 where

u :: Integer -- this tells you that `u` takes nothing and returns an Integer
u = let a = 2
        b = a + (let a = 3
                 in a+b)
    in b*b

只需将内部a替换为常数3

u' :: Integer
u' = let a = 2
         b = a + (3+b)
     in b*b

对外部a做同样的事情

u'' :: Integer
u'' = let b = 2 + (3+b) in b*b

加法是结合的

u''' :: Integer
u''' = let b = 5+b in b*b

用等效函数替换 let 绑定

u'''' :: Integer
u'''' = (5 + u'''') ^ 2

你现在看到问题了吗? 它是一个不带参数的函数,它返回一个Integer类型的值,该值是5加上自身的平方。 在某个时间点自身的价值是多少? 你递归地评估它并且永远得不到答案。

不过我们可以解决这个问题。 让函数接受一个参数并像这样建立一个终止条件。

u''''' :: Integer -> Integer
u''''' 0 = 0
u''''' x = (5 + u''''' (x - 1)) ^ 2

x每次调用都会变小1 ,当它达到0 ,它将返回0或您想要的任何其他值。 这就是所谓的递归,它总是相同的,建立一个或多个基本情况和递归关系。

请注意,递推关系在离散数学中与分析中的微分方程相对应。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM