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
所以我在Haskell中编写了这段代码,目的是搜索输入数字x,y中有多少位数相等,当我尝试设置一个计数器时(在我的代码k中)我不能调用getprize使用k因为它被注册为整数如何将计数器设置为int所以我可以计算多少位数相同?
答案 0 :(得分:3)
我不能说我理解你在代码中想要做什么,但我想我可以解决你的标题问题引起的一个根本误解(“在haskell中设置计数器并增加它”)
Haskell中的所有值都是不可变的,这意味着它们在设置后无法更改。当你写k = 0 + 1
时,这意味着在永恒的剩余时间里,每当有人看到k
时,他们肯定知道它真的意味着0 + 1
,这当然等于1
}。因此,您无法为函数的每次迭代更改k
的值。
以下是使用递归来模拟Haskell中的迭代的示例。此函数将采用一个数字,并将所有小于或等于该数字的数字加到0:
sumLessThan :: Int -> Int
sumLessThan 0 = 0
sumLessThan k = k + sumLessThan (k - 1)
现在,如果我评估sumLessThan 3
,我们可以看到使用第二个函数定义,并将3
替换为k
来获取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
正如您所看到的,我们没有跟踪单独的值并基于此计算结果,我们正在根据较小的结果计算结果 ,越来越小,直到我们到达我们的基本案例,这是一个易于计算的简单案例。我们的基本案例是sumLessThan 0 = 0
这是在Haskell中编写“循环”时要遵循的正确模式。您不应该尝试使用单独的“迭代器”值。