list - 带扑克牌的 Haskell 函数(返回手牌值)

标签 list haskell playing-cards

我在复习周,我正在努力为 Haskell 考试准备一份过去的试卷。然而,这个功能是我无法应付的。

扑克牌的值表示如下: '2', '3', '4', '5', '6', '7', '8', '9', 'T', 'J', 'Q', 'K', 'A '. 一手牌可以写成字符串,例如“A563Q”。

我需要写一个函数 scoreHand::[PlayingCardValue] -> Int 这将返回一手牌的总值(value)。 'A' 的值为 11。'T'、'J'、'Q' 和 'K' 的值为 10。其他数字有其面值('2' 的值为 2、'3 ' 的值为 3,依此类推)。

所以我应该写这个函数的两个版本。 第一个使用递归,不使用库函数或列表理解,第二个相反(又名)使用列表理解、库函数等。

我用递归写了这个版本,但我正在努力解决另一个问题 版本。

这是我的递归代码(即使我使用的是一个库函数,但我最终会弄清楚的)

*

import Data.Char
type PlayingCardValue = Char
scoreHand :: [PlayingCardValue] -> Int
scoreHand [] = 0
scoreHand (x:xs) =
  if x > '1' && x < '9'
    then digitToInt x + scoreHand (xs)
    else if x == 'T' || x == 'J' || x == 'Q' || x == 'K'
      then 10 + scoreHand (xs)
        else if x == 'A'
          then 11 + scoreHand (xs)
          else 0 + scoreHand (xs)

* 关于如何在不使用递归的情况下创建相同的函数有什么想法吗?

最佳答案

首先,我认为您可以通过引入 函数使代码更优雅:

score :: PlayingCardValue -> Int
score '2' = 2
score '3' = 3
score '4' = 4
score '5' = 5
score '6' = 6
score '7' = 7
score '8' = 8
score '9' = 9
score 'T' = 10
score 'J' = 10
score 'Q' = 10
score 'K' = 10
score 'A' = 11
score _ = 0

所以现在我们可以计算单个卡片的分数。我们可以使用 digitToInt :: Char -> Int如果我们愿意的话。单张牌的分数计算方式也更加简洁。

接下来我们可以使用递归:

scoreHand :: [PlayingCardValue] -> Int
scoreHand [] = 0
scoreHand (x:xs) = score x + scoreHand xs

如果我们想写一个非递归的,我们可以使用map :: (a -> b) -> [a] -> [b] , 和 sum :: Num a => [a] -> a :

scoreHand :: [PlayingCardValue] -> Int
scoreHand xs = sum (map score xs)

因此,通过使用 map score xs,我们创建了一个新列表,其中对于列表 xs 中的每张卡片,我们都有一个包含分数的元素,然后我们总结这些值。我们可以通过使用函数组合来更优雅地编写它:

scoreHand :: [PlayingCardValue] -> Int
scoreHand = sum . map score

关于list - 带扑克牌的 Haskell 函数(返回手牌值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48063879/

相关文章:

javascript - 如何获取json对象标题

haskell - 是否有用于编写词法分析器的 haskell EDSL?

python - 从文本文件加载列表

list - Haskell 列表中元素的索引

Haskell Data.Void : undefined turns into infinite loop

haskell - 如何在 haskell 中过滤列表并取出平方数

python - "Pop index out of range"用于纸牌

javascript - 设计一款集换式纸牌游戏

python - 对扑克牌列表进行排序 [python]

python - 我希望输出像 [[0,0,0,0,],[0,1,0,0],[0,2,0,0],[0,3,0,0]]