![](/img/trans.png)
[英]In Raku, how does one write the equivalent of Haskell's span function?
[英]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])
。 您甚至可能需要閱讀文檔中的部分兩次以了解break
和span
之間的細微差別。
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
函數的另一種方法是將其視為由takeWhile
和dropWhile
函數組成。 即它是takeWhile
和dropWhile
函數的應用。
這兩個函數是什么?
takeWhile
根據文檔
takeWhile 應用於謂詞 p 和列表 xs,返回滿足 p 的元素 xs 的最長前綴(可能為空):
基本上,只要謂詞為真,它就會從列表中返回元素。 這意味着如果第一個元素失敗,謂詞takeWhile
將返回 []
dropWhile
另一方面,根據文檔
dropWhile p xs 返回 takeWhile p xs 后剩余的后綴
基本上它在謂詞返回true時不斷跳過列表中的元素。 一旦謂詞返回 false,則返回列表中的其余元素。
要查看我上面關於span
的聲明是否同時應用了takeWhile
和dropWhile
函數,我們可以獨立應用這些函數來查看它們的結果。
只使用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
同時應用takeWhile
和dropWhile
請注意,您在此處描述的內容:
我認為跨度函數是 Haskell 是將謂詞應用於列表,並返回一個元組,其中第一個元素是列表中滿足該謂詞的元素,第二個元素是列表的提醒
是從文檔中可以看出的partition
函數
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.