我用Data.List.groupBy
写了一些东西。它没有按预期工作,所以我最终写了我自己的版本groupBy
:毕竟我不确定Data.List
应该这样做(没有真正的文档)。什么是群体应该做的?
无论如何,我的测试通过了我的版本groupBy
,而它的失败与Data.List
。 我发现(感谢quickcheck
)两个函数行为不同的情况,我仍然不明白为什么这两个版本之间存在差异。是Data.List
版本的车或是我的? (当然,我的天真实施并不是最有效的方式)。
下面是代码:在GHC运行
import qualified Data.List as DL
import Data.Function (on)
import Test.QuickCheck
groupBy' :: (a -> a -> Bool) -> [a] -> [[a]]
groupBy' _ [] = []
groupBy' eq (x:xs) = xLike:(groupBy' eq xNotLike) where
xLike = x:[ e | e <- xs, x `eq` e ]
xNotLike = [ e | e <- xs, not $ x `eq` e ]
head' [] = Nothing
head' (x:xs) = Just x
prop_a s = (groupBy' by s) == (DL.groupBy by s) where
types = s :: [String]
by = (==) `on` head'
quickCheck prop_a
回报["", "a", ""]
*Main> groupBy' ((==) `on` head') ["","a",""]
[["",""],["a"]] # correct in my opinion
*Main> DL.groupBy ((==) `on` head') ["","a",""]
[[""],["a"],[""]] # incorrect.
发生了什么事?我无法相信haskell平台有bug。
'groupBy'函数将一个列表分割成几部分,例如'concat。 groupBy f == id'(以及其他法律)。 – augustss