在haskell中设置计数器并递增

sha*_*ath 2 haskell

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以便可以计算多少个数字相同?

Laz*_*oke 5

我不能说我理解您要在代码中执行的操作,但是我认为我可以解决您的标题问题(“在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,我们可以看到使用第二个函数定义并替换3kget 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中编写“循环”时,这是遵循的正确模式。您不应尝试使用单独的“迭代器”值。