有几种方法可以完成此操作,对于所有这些方法,我们将编写一个函数,该函数也将输入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中非常重要的概念,因此请确保在进行操作之前了解这里的情况。
另一种解决方案是使用find
中的功能Data.List
,记录在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"
请注意,由于find
返回Maybe
,因此我们正在使用case语句检查是否在列表中找到了匹配的元素。
另外,(==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"
甚至可以使用maybe
中的Data.Maybe
(也使用$
):
search n charKeys = maybe (error "Requested key not found") (replicate 3) $ lookup n charKeys
本文链接:https://www.f2er.com/3140678.html