有几种方法可以做到这一点,我们将为所有这些方法编写一个函数,该函数也将charKeys 作为输入。
最重要的是使用递归:
search n charKeys = if n == fst (head charKeys) then replicate 3 (snd (head charKeys)) else search n (tail charKeys)
我们可以像这样使用模式匹配和函数保护来重写它:
search n ((k,c):lst) | k == n = replicate 3 c
| otherwise = search n lst
覆盖模式匹配的所有可能输入也是一种很好的做法,因此我们添加了以下附加行:
search _ [] = error "Requested key not found"
这些是 Haskell 中非常重要的概念,因此请确保在继续之前了解这里发生了什么。
另一种解决方案是使用来自Data.List 的函数find,记录在here:
import Data.List (find)
search n charKeys = case find ((==n) . fst) charKeys of
Just (_,c) -> replicate 3 c
Nothing -> error "Requested key not found"
请注意,我们使用 case 语句来检查是否在列表中找到了匹配的元素,因为 find 返回一个 Maybe。
此外,(==n) . fst 是一种更惯用的说法 \x -> fst x == n,使用组合和运算符双关语。
我们可以通过使用 Prelude 的 lookup 函数进一步简化这个过程:
search n charKeys = case lookup n charKeys of
Just c -> replicate 3 c
Nothing -> error "Requested key not found"
甚至更多地使用来自Data.Maybe 的maybe(也使用$):
search n charKeys = maybe (error "Requested key not found") (replicate 3) $ lookup n charKeys