在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 presto
scrabble
现在是
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没有位置(特别是在个人代码中),但它几乎总是可以在这里发表评论,尤其是当你不确定询问者的资格时。无论如何,您的评论解决了这个问题。:)