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