【问题标题】:Haskell - how to create a function that returns the fifth element from a listHaskell - 如何创建一个从列表中返回第五个元素的函数
【发布时间】:2012-02-10 06:40:23
【问题描述】:

如何在 Haskell 中创建一个返回列表中第五个元素的函数。

类似这样的:

fifth [] = []!!4

应该返回这个:

*Main> fifth [1,2,3,20,30,40]
30

【问题讨论】:

    标签: list function haskell


    【解决方案1】:

    简单使用:

    fifth :: [a] -> a
    fifth l = l !! 4
    

    像您建议的那样使用fifth [] 是错误的,因为这会将列表与空列表进行模式匹配——您只需要将变量名绑定到完整列表,以便之后可以使用!! 函数。

    您甚至可以将函数定义为:

    fifth :: [a] -> a
    fifth = (!!4)
    

    这里我们使用partial application:您通常认为!! 是一个带有两个参数的函数:一个列表和一个整数。我们可以为它提供一个参数并获得一个只接受一个列表的新函数 (fifth)。当我们为(!!4) 提供一个列表时,它会返回第五个元素:

    Prelude> let fifth = (!!4)
    Prelude> fifth [1,2,3,20,30,40]
    30
    

    该函数当然是一个部分函数,因为它对于小列表会失败:

    Prelude> (!!4) [1,2,3,20]
    *** Exception: Prelude.(!!): index too large
    

    这是意料之中的。如果你愿意,你可以让它返回 Maybe a 而不是 a::

    fifth :: [a] -> Maybe a
    fifth (a:b:c:d:e:rest) = Just e
    fifth _ = Nothing
    

    这里第一个模式将匹配长度为 5 或更多的列表,第二个模式匹配第一个模式不匹配的任何内容。你可以这样使用它:

    *Main> fifth [1,2,3,20,30,40]
    Just 30
    *Main> fifth [1,2,3,20]
    Nothing
    

    您现在强制自己始终将fifth 的结果与Just aNothing 进行模式匹配。这意味着当您编码调用fifth someList 时,它必须 考虑到someList 可能太短。这样你就可以确保在编译时这个函数不会有任何运行时错误。

    【讨论】:

    • +1 @Martn You have now forced yourself ... 除非他发现如何写 unJust,那就是.....
    • @Ingo:嘘,让我们保持在你我之间:-)
    【解决方案2】:

    我将定义一个安全索引运算符!!!,然后根据!!! 定义fifth

    (!!!)                  :: [a] -> Int -> Maybe a
    xs       !!! n | n < 0 =  Nothing
    []       !!! _         =  Nothing
    (x : _)  !!! 0         =  Just x
    (_ : xs) !!! n         =  xs !!! (n - 1)
    
    fifth :: [a] -> Maybe a
    fifth =  (!!! 4)
    

    【讨论】:

    • 这是我回答的一个很好的概括,我喜欢!
    【解决方案3】:

    另一个不安全变体是

    fifth = head . drop 4
    

    但是,嘿,有时人们只知道这个该死的列表将包含超过 4 个元素。类型系统不足以表达它(即使用标准列表)。

    【讨论】:

    • 安全版:fifth = listToMaybe . drop 4
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-12
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多