2014-10-19 115 views
3

我想知道haskell如何忽略以下表達式。Haskell - span elem:評估

span (`elem` ['A'..'Z']) "BOBsidneyMORGANeddy" 

結果是

("BOB","sidneyMORGANeddy") 

任何人都可以解釋我的評估過程?因爲我不能說出它爲什麼像上面那樣分裂。

+0

它在's'處被分割,因爲這是第一個字母,它不是集合'A'。'Z''中的_not_。 – MathematicalOrchid 2014-10-20 11:31:35

回答

6

span將使用謂詞將列表分成兩部分,第一部分是給定謂詞成立的最長前綴,第二部分是列表的其餘部分。換言之,第一部分與takeWhile一樣獲得,第二部分與dropWhile一樣獲得相同的謂詞。

現在讓我們來看看謂詞。 elem :: a->[a]->Bool指示給定元素是否在給定列表中找到。整潔的訣竅是,兩個或多個參數的任何功能,可以在中間符號可以使用:

x `elem` xs 

相同elem x xs。因此,

`elem` xs 

被視爲與中綴函數的部分一樣。它與\x -> elem x xs相同。

您現在可以看到,span被給予謂詞測試,以確定是否可以在列表['A'..'Z']中找到要拆分的列表元素。所以它會將列表分成兩部分:它找到謂詞不包含的第一個元素,這就是分割點。這是第二個分區如何以第一個小寫字母開頭的方式。