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

时间:2019-01-19 23:27:18

标签: haskell

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

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

1 个答案:

答案 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或您想要的任何其他值。这就是所谓的递归,它总是相同的,建立一个或多个基本案例和一个递归关系。

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