我之前几次遇到这个问题,但不确定是什么原因。我只是简单地关闭命令窗口并重新打开。例如,我在编译器中输入u
并没有任何反应(不知道如何解释这一点,如果您自己尝试的话会更好)。如果sb可以向我解释问题及其解决方法,那就太好了!
u = let a = 2
b = a + (let a = 3
in a+b)
in b*b
答案 0 :(得分:2)
您的功能非常荒谬,您知道吗?让我们做一点数学, 我们可以。
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
或您想要的任何其他值。这就是所谓的递归,它总是相同的,建立一个或多个基本案例和一个递归关系。
请注意,递归关系在离散数学中与分析中的微分方程是相对应的。