2011-05-29 25 views
2

我怎么能轻易采取以下提取一个从[A]

[4] 

,并返回以下内容:

4 

我知道,[4] !! 0的作品,但似乎并不是一个很好的策略......

回答

11

只是模式匹配它:

getSingleton [a] = a 
2

如果你想在一个列表这第一个项目,你可以做

head [4] 
5

或者到gatoatigrado的解决方案,您还可以使用head功能,提取列表的第一个元素,但也列出了更多的工作而不是一个元素,另外还是Prelude中的标准功能。你只需要小心,不要将它应用到空列表中,否则你会得到一个运行时异常。

Prelude> head [4] 
4 
Prelude> head [] 
*** Exception: Prelude.head: empty list 
+0

其实它并不完全一样gatoatigrado的解决方案。具体来说,'head'将返回多个元素列表中的第一个元素,而如果给出多个元素的列表,'getSingleton'会导致错误。当然最好取决于用例。 – sepp2k 2011-05-30 07:03:23

+0

哦,是的,你说得对,谢谢你指出,我忽略了。我会相应地更新我的答案。 – 2011-05-30 16:45:26

6

head是正常的回答,你看到三个(一个使用自定义名称) - 这是功能上与你已经知道(x !! 0head x)。我强烈建议不要使用部分函数,​​除非您可以证明(使用本地知识)您永远不会传递空列表并导致运行时异常。

如果您的功能并不能保证一个非空列表,然后使用listToMaybe :: [a] -> Maybe a

> listToMaybe [4] 
Just 4 
> listToMaybe [5,39,-2,6,1] 
Just 5 
> listToMaybe [] 
Nothing   -- A 'Nothing' constructor instead of an exception 

一旦你上了Maybe a你可以模式匹配,保持它作为也许并使用fmap或也许单子,或some other method to perform further operations

0

[]是一个monad。所以你用单子“提取”操作,<-

double x = 2*x 

doubleAll xs = do x <- xs 
        return (double x) 

当然,一元计算的结果是在单子回来。 ;)