Haskell 中的跨度函数

s66*_*666 4 haskell list

我认为跨度函数是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])。所以我想知道它的原因。

bug*_*ugs 11

您对span 的理解并不完全正确,这是官方文档所说的:

应用于谓词 p 和列表 xs 的 span 返回一个元组,其中第一个元素是满足 p 的元素的 xs 的最长前缀(可能为空),第二个元素是列表的其余部分

(强调我的)。

因此,谓词从头开始应用于列表的每个元素。这意味着谓词在

span (<3) [1,2,4,5,6]
Run Code Online (Sandbox Code Playgroud)

满足前两个元素,结果为

([1,2], [4,5,6])
Run Code Online (Sandbox Code Playgroud)

但在另一个例子中

span (>3) [1,2,4,5,6]
Run Code Online (Sandbox Code Playgroud)

列表的第一个元素已经不满足谓词,因此返回的元组的第一个元素将是一个空列表。


Wil*_*sem 7

你在这里描述的是partition :: (a -> Bool) -> [a] -> ([a], [a]). 这是对于给定的谓词将采取名单,并进行了2元组,其中第一项是满足谓词的项目列表,第二项是做项目列表的功能并不满足谓词。的确:

Prelude Data.List> partition (>3) [1,2,4,5,6]
([4,5,6],[1,2])
Run Code Online (Sandbox Code Playgroud)

span :: (a -> Bool) -> [a] -> ([a], [a])另一方面,生成一个 2 元组,其中第一项是列表中满足谓词的元素的最长前缀,第二项是剩余元素的列表。由于对span (>3) [1,2,4,5,6],第一个项目并不能满足谓词。最长的前缀是空列表[],给定列表的所有元素都出现在第二项中。