比较Haskell中的两个数字

时间:2015-03-24 06:05:54

标签: haskell

http://i.stack.imgur.com/71w9v.png

我必须找到一名球员赢了多少钱。

这必须通过创建一个名为digits Int->Int->Int的函数来完成。例如,如果第一个输入是13758455而函数的第二个输入是13758455,那么我应该在编译器中获得1000000

这通常是Java中的一项简单任务,但是当我在数字中找到更多数字时,我无法找到计数器之类的东西。

1 个答案:

答案 0 :(得分:1)

由于Haskell中没有状态,你不能拥有像命令式语言那样的计数器。

你经常会使用递归来解决这个问题。这是一个例子:

module Main where

moneyWon :: Int -> Int
moneyWon 8 = 1000000
moneyWon 7 = 100000
moneyWon 6 = 8000
moneyWon 5 = 300
moneyWon 4 = 20
moneyWon 3 = 5
moneyWon 2 = 1
moneyWon _ = 0

digits :: Int -> Int -> Int
digits 0 0 = 0
digits x y = digits dx dy + if mx == my then 1 else 0
    where (dx, mx) = divMod x 10
          (dy, my) = divMod y 10

main = do
    print $ (moneyWon . digits 12345678) 12345668

注意:

  • 计算相应的数字并评估奖品是两个不同的问题,这就是我将它们分开的原因
  • divMod x 10是获得基数10中最低含义数字的方法
  • 在现实生活中,你不应该使用整数来保存数字,因为它更像是列表而不是数字(这就是数字从10000000开始而不是0的原因,迫使用户输入正确的数字位)。
  • 使用Int离开任务来检查号码是否有效。