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

问题描述:

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

事情是这样的:

fifth [] = []!!4 

应该返回此:

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

只需使用:

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 

这是可以预料到。如果你愿意,你可以把它安全通过让它返回aMaybe 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可能太短。这样你可以确保在编译时间那里不会有任何运行时来自这个函数的错误。

+0

谢谢!有效。 – integral007 2012-01-14 08:52:29

+0

+1 @Martn'你现在强迫自己......'除非他发现如何写不公正的,那就是...... – Ingo 2012-01-14 10:52:32

+0

@Ingo:嘘,让我们保持你和我之间的关系:-) – 2012-01-14 12:28:18

我将定义一个安全索引运算符!!!,然后根据!!!定义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) 
+2

这是一个很好的我的答案的概括,我喜欢! – 2012-01-14 09:54:08

另一个不安全变种会

fifth = head . drop 4 

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

+5

安全版本:'fifth = listToMaybe。下降4' – hammar 2012-01-14 11:42:48