【问题标题】:Haskell - Searching the entire list for an charHaskell - 在整个列表中搜索一个字符
【发布时间】:2019-11-08 02:03:24
【问题描述】:

我有以下列表:

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

现在我想在列表中搜索一个字符并将另一个字符复制 3 次。 我想要这样的功能:

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

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

谁能帮助我,如果 x == '2' 或 '5' 该功能也可以工作?

【问题讨论】:

  • 你试过什么?你熟悉递归函数吗? lookup 函数怎么样?

标签: list function haskell haskell-platform


【解决方案1】:

有几种方法可以做到这一点,我们将为所有这些方法编写一个函数,该函数也将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.Maybemaybe(也使用$):

search n charKeys = maybe (error "Requested key not found") (replicate 3) $ lookup n charKeys

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 2016-11-20
    • 2015-10-10
    • 2011-11-26
    • 2019-08-26
    • 1970-01-01
    • 2017-06-19
    相关资源
    最近更新 更多