在haskell中查找拼字游戏单词的分数
我有一个字母对应其各自的分数在haskell中查找拼字游戏单词的分数,haskell,Haskell,我有一个字母对应其各自的分数 dict = fromList([("A",1), ("B",3), ("C", 3), ("E", 1), ("D", 2), ("G", 2), ("F", 4), ("I", 1), ("H", 4), ("K", 5), ("J", 8), ("M", 3), ("L", 1), ("O", 1), ("N", 1), ("Q", 10), ("P", 3), ("S", 1), ("R", 1), ("U", 1), ("T", 1), ("W", 4),
dict = fromList([("A",1), ("B",3), ("C", 3), ("E", 1), ("D", 2), ("G", 2), ("F", 4), ("I", 1), ("H", 4), ("K", 5), ("J", 8), ("M", 3), ("L", 1), ("O", 1), ("N", 1), ("Q", 10), ("P", 3), ("S", 1), ("R", 1), ("U", 1), ("T", 1), ("W", 4), ("V", 4), ("Y", 4), ("X", 8), ("Z", 10)])
如果main向函数发送一个单词,函数应返回与dict和单词中字母相关的分数
例:-主:-苹果
函数应返回:-9
(A Score)1+(P Score)3 +(P Score)3 + (L Score) 1+(E Score)1 = 9
您可以使用
lookup
创建将键映射到值的函数:
mapper :: Eq k => [(k, v)] -> k -> v
mapper dict k = case lookup k dict of Nothing -> undefined
(Just v) -> v
scrabble :: Char -> Int
scrabble = mapper [ ('A', 1)
, ('B', 3)
, ('C', 3)
, ('E', 1)
, ('D', 2)
, ('G', 2)
, ('F', 4)
, ('I', 1)
, ('H', 4)
, ('K', 5)
, ('J', 8)
, ('M', 3)
, ('L', 1)
, ('O', 1)
, ('N', 1)
, ('Q', 10)
, ('P', 3)
, ('S', 1)
, ('R', 1)
, ('U', 1)
, ('T', 1)
, ('W', 4)
, ('V', 4)
, ('Y', 4)
, ('X', 8)
, ('Z', 10)
]
现在,您只需创建一个函数,该函数接受一个字符串并返回其分数:
score :: String -> Int
score = sum . map scrabble
main = print $ score "APPLE"
就这些
编辑:当查找失败时,在mapper
中返回undefined
没有什么错。如果您需要错误处理,您可以简单地将mapper
定义为flip lookup
,并且hey prestoscrabble
现在是Char->Maybe Int
类型
考虑如何使用模式匹配编写scrabble
:
scrabble :: Char -> Int
scrabble 'A' = 1
scrabble 'B' = 3
scrabble 'C' = 3
scrabble 'D' = 2
scrabble 'E' = 1
scrabble 'F' = 4
scrabble 'G' = 2
scrabble 'H' = 4
scrabble 'I' = 1
scrabble 'J' = 8
scrabble 'K' = 5
scrabble 'L' = 1
scrabble 'M' = 3
scrabble 'N' = 1
scrabble 'O' = 1
scrabble 'P' = 3
scrabble 'Q' = 10
scrabble 'R' = 1
scrabble 'S' = 1
scrabble 'T' = 1
scrabble 'U' = 1
scrabble 'V' = 4
scrabble 'W' = 4
scrabble 'X' = 8
scrabble 'Y' = 4
scrabble 'Z' = 10
如果模式匹配失败,那么最终还是会得到一个底部值。如果您知道模式匹配永远不会失败,那么这不是问题。如果您确实需要处理故障,那么只需使用我上面提到的flip lookup
main = print $ calWordScore "APPLE"
calcWordScore :: String -> Int
calcWordScore word = sum $ map calcLetterScore word
calcLetterScore :: Char -> Int
calcLetterScore ch = Map.fromList([('A',1), ('B',3), ('C', 3), ('E', 1), ('D', 2), ('G', 2), ('F', 4), ('I', 1), ('H', 4), ('K', 5), ('J', 8), ('M', 3), ('L', 1), ('O', 1), ('N', 1), ('Q', 10), ('P', 3), ('S', 1), ('R', 1), ('U', 1), ('T', 1), ('W', 4), ('V', 4), ('Y', 4), ('X', 8), ('Z', 10)]) Map.! ch
你需要
导入符合条件的Data.Map.Lazy作为Map您有什么问题?如果你想得到代码方面的帮助,你必须发布它。这个网站不是一个解决问题/家庭作业的服务。你应该发布你的解决方案尝试,这样我们就可以对其进行评论并向正确的方向推进。哎哟,
未定义
!没有人对使用它发表评论?我不认为这是个问题。总是想解释可能失败的背景是悲观的。有时候,乐观地对可能的失败说“去你的”会更好——特别是如果你确信你的代码不会被其他人使用,并且你知道你永远不会进入一个糟糕的状态。无论如何,我更新了我的答案并解决了这个问题。我应该更具体一些。我并不是说undefined没有位置(特别是在个人代码中),但它几乎总是可以在这里发表评论,尤其是当你不确定询问者的资格时。无论如何,您的评论解决了这个问题。:)