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

int*_*007 3 haskell function list

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

像这样的东西:

fifth [] = []!!4
Run Code Online (Sandbox Code Playgroud)

应该归还:

*Main> fifth [1,2,3,20,30,40]
30
Run Code Online (Sandbox Code Playgroud)

Mar*_*ler 11

只需使用:

fifth :: [a] -> a
fifth l = l !! 4
Run Code Online (Sandbox Code Playgroud)

fifth []像你建议的那样使用是错误的,因为这会使列表与空列表匹配 - 你只需要将变量名称绑定到完整列表,以便!!以后可以使用该函数.

您甚至可以将功能定义为:

fifth :: [a] -> a
fifth = (!!4)
Run Code Online (Sandbox Code Playgroud)

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

Prelude> let fifth = (!!4)
Prelude> fifth [1,2,3,20,30,40]
30
Run Code Online (Sandbox Code Playgroud)

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

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

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

fifth :: [a] -> Maybe a
fifth (a:b:c:d:e:rest) = Just e
fifth _ = Nothing
Run Code Online (Sandbox Code Playgroud)

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

*Main> fifth [1,2,3,20,30,40]
Just 30
*Main> fifth [1,2,3,20]
Nothing
Run Code Online (Sandbox Code Playgroud)

你现在已经强迫自己总是模式匹配fifth对任何一个Just a或的结果Nothing.这意味着当您对呼叫进行编码时fifth someList,必须考虑到someList可能太短的问题.这样,您可以在编译时确保此函数不会出现任何运行时错误.


mis*_*tor 8

我将定义一个安全索引操作!!!,然后定义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)
Run Code Online (Sandbox Code Playgroud)

  • 这是我的答案的一个很好的概括,我喜欢! (2认同)

Ing*_*ngo 5

另一个不安全的变种是

fifth = head . drop 4
Run Code Online (Sandbox Code Playgroud)

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

  • 安全版:`first = listToMaybe.下降4` (5认同)