2011-05-29 26 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) 

當然,一元計算的結果是在單子回來。 ;)