Haskell-在整个列表中搜索字符

我有以下列表:

 charKeys=[('1','a'),('2','b'),('3','c'),('4','d'),('5','e')]

现在,我想在列表中搜索一个字符,并将其他字符复制三遍。 我想要一个这样的功能:

 search x = if x == fst(charKeys !! 0) then replicate 3 (snd(charKeys !! 0)) else "Error" 

但是此函数仅检查列表的第一个索引,并且仅适用于x =='1'。

有人可以帮我吗,如果x =='2'或'5',该函数也可以工作吗?

xuhe001 回答:Haskell-在整个列表中搜索字符

有几种方法可以完成此操作,对于所有这些方法,我们将编写一个函数,该函数也将输入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

大家都在问