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

Haskell 加载一个函数,但ghci似乎没有编译它,haskell,Haskell,我以前遇到过几次这种问题,但不确定原因是什么。我只需关闭命令窗口并重新打开。例如,我在编译器中输入u,但什么也没发生(不知道如何解释,最好自己试试)。如果有人能向我解释这个问题以及如何解决它,那就太好了 u = let a = 2 b = a + (let a = 3 in a+b) in b*b 你的函数很荒谬,你知道吗?让我们做一点数学, 我们可以吗 module Q54272249 where u :: Integer -- t

我以前遇到过几次这种问题,但不确定原因是什么。我只需关闭命令窗口并重新打开。例如,我在编译器中输入
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
或任何其他您想要的值。这就是所谓的递归,它总是一样的,建立一个或多个基本情况和一个递归关系


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

您创建了一个循环定义,因此Haskell陷入了“无限循环”中。请注意,在Haskell中,您不赋值,而是声明这些值,因为您编写了
b=a+3+b
(本质上),因此,您构建了一个表达式,它是根据自身定义的,没有停止条件,因此它将继续计算。如果我们不知道预期的行为应该是什么,修复某些内容是很困难的。(根据你的说法)这里到底应该发生什么?我只是在测试有界变量和无界变量的概念。问题:第一行中的
a
和第二行中的第一个
a
不代表同一个变量,对吗?在ghci中(以及在任何地方,始终)do
:设置-墙
以了解名称阴影