簡體   English   中英

Haskell 中的跨度函數

[英]span function in Haskell

我認為跨度函數是Haskell是將謂詞應用於列表,並返回一個元組,其中第一個元素是列表中滿足該謂詞的元素,第二個元素是列表的提醒。

當我輸入: span (<3) [1,2,4,5,6]時效果很好。 它只是在 GHCI 中返回: ([1,2], [4,5,6])

但是,當我輸入span (>3) [1,2,4,5,6] ,它返回([],[1,2,4,5,6]) 但我認為它應該返回([4,5,6],[1,2]) 所以我想知道它的原因。

您對span 的理解並不完全正確,這是官方文檔所說的:

應用於謂詞 p 和列表 xs 的 span 返回一個元組,其中第一個元素是滿足 p 的元素的 xs 的最長前綴(可能為空),第二個元素是列表的其余部分

(強調我的)。

因此,謂詞從頭開始應用於列表的每個元素。 這意味着謂詞在

span (<3) [1,2,4,5,6]

滿足前兩個元素,結果為

([1,2], [4,5,6])

但在另一個例子中

span (>3) [1,2,4,5,6]

列表的第一個元素已經不滿足謂詞,因此返回的元組的第一個元素將是一個空列表。

你在這里描述的是partition :: (a -> Bool) -> [a] -> ([a], [a]) 這是對於給定的謂詞將采取名單,並進行了2元組,其中第一項是滿足謂詞的項目列表,第二項不滿足謂詞的項目列表的功能。 的確:

Prelude Data.List> partition (>3) [1,2,4,5,6]
([4,5,6],[1,2])

span :: (a -> Bool) -> [a] -> ([a], [a])另一方面,使一個2元組,其中第一項是在滿足列表中要素的最長前綴謂詞,第二項是剩余元素的列表。 由於用於span (>3) [1,2,4,5,6]第一項不滿足謂詞。 最長的前綴是空列表[] ,給定列表的所有元素都出現在第二項中。

基本上span的補碼是一種break :: (a -> Bool) -> [a] -> ([a], [a]) 您甚至可能需要閱讀文檔中的部分兩次以了解breakspan之間的細微差別。

break ,施加到謂詞p和列表XS,返回不滿足p和第二元件元件的x s的元組,其中第一元件是最長前綴(可能為空)是該列表的其余部分:

所以回到你的問題

λ> break (>3) [1,2,4,5,6]
([1,2],[4,5,6])

如果有必要swap :: (a, b) -> (b, a)您當然可以swap :: (a, b) -> (b, a)元組。 IE。 swap . break

查看span函數的另一種方法是將其視為由takeWhiledropWhile函數組成。 即它是takeWhiledropWhile函數的應用。

這兩個函數是什么?

takeWhile根據文檔

takeWhile 應用於謂詞 p 和列表 xs,返回滿足 p 的元素 xs 的最長前綴(可能為空):

基本上,只要謂詞為真,它就會從列表中返回元素。 這意味着如果第一個元素失敗,謂詞takeWhile將返回 []

dropWhile另一方面,根據文檔

dropWhile p xs 返回 takeWhile p xs 后剩余的后綴

基本上它在謂詞返回true時不斷跳過列表中的元素。 一旦謂詞返回 false,則返回列表中的其余元素。

要查看我上面關於span的聲明是否同時應用了takeWhiledropWhile函數,我們可以獨立應用這些函數來查看它們的結果。

只使用takeWhile

*Main Data.List> takeWhile (>3) [1,2,4,5,6]
[]

僅使用dropWhile

*Main Data.List> dropWhile (>3) [1,2,4,5,6]
[1,2,4,5,6]

現在使用span

*Main Data.List> span (>3) [1,2,4,5,6]
([],[1,2,4,5,6])

結果確認span同時應用takeWhiledropWhile

請注意,您在此處描述的內容:

我認為跨度函數是 Haskell 是將謂詞應用於列表,並返回一個元組,其中第一個元素是列表中滿足該謂詞的元素,第二個元素是列表的提醒

是從文檔中可以看出的partition函數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM