digits :: Int->Int->Int
digits x y
|x`mod`10 == y`mod`10 = count x y
|otherwise = digits (x`div`10) (y`div`10)
count :: Int -> Int -> Int
k = 0 + 1
count x y
|x < 1 = getprize k
|otherwise = digits (x`div`10) (y`div`10)
getprize :: Int -> Int
getprize k
|k == 8 = 1000000
|k == 7 = 100000
|k == 6 = 8000
|k == 5 = 300
|k == 4 = 20
|k == 3 = 5
|k == 2 = 1
|k < 2 = k
|otherwise = 43
Run Code Online (Sandbox Code Playgroud)
所以我用Haskell编写了这段代码,目的是搜索输入数字x,y中等于多少个数字,并且当我尝试设置一个计数器(在我的代码k中)时,我无法用k调用getprize,因为注册为整数如何将计数器设置为int以便可以计算多少个数字相同?
我不能说我理解您要在代码中执行的操作,但是我认为我可以解决您的标题问题(“在haskell中设置计数器并对其进行递增”)引起的基本误会。
Haskell中的所有值都是不可变的,这意味着它们在设置后无法更改。当您写作时k = 0 + 1,这意味着在永恒的余晖中,只要有人看到k他们就肯定知道这确实意味着0 + 1,这当然等于1。因此,您无法在函数的k每次迭代中获得更改的价值。
这是在Haskell中使用递归模拟迭代的示例。此函数将获取一个数字,并将所有小于或等于该数字的数字加到0。
sumLessThan :: Int -> Int
sumLessThan 0 = 0
sumLessThan k = k + sumLessThan (k - 1)
Run Code Online (Sandbox Code Playgroud)
现在,如果我进行评估sumLessThan 3,我们可以看到使用第二个函数定义并替换3为kget sumLessThan 3 = 3 + sumLessThan (3 - 1)。如果继续前进,我们最终会找到实际结果:
sumLessThan 3
3 + sumLessThan (3 - 1)
3 + sumLessThan 2
3 + (2 + sumLessThan (2 - 1))
3 + (2 + sumLessThan 1)
3 + (2 + (1 + sumLessThan 0))
3 + (2 + (1 + 0))
3 + (2 + 1)
3 + 3
6
Run Code Online (Sandbox Code Playgroud)
如您所见,我们没有跟踪单独的值并以此为基础来计算结果,我们以较小的结果来计算结果,并且越来越小,直到达到基本情况为止,这是一个琐碎的情况很容易计算。我们的基本情况是sumLessThan 0 = 0
在Haskell中编写“循环”时,这是遵循的正确模式。您不应尝试使用单独的“迭代器”值。