【发布时间】:2014-04-06 18:09:57
【问题描述】:
我使用Data.List.groupBy 写了一些东西。它没有按预期工作,所以我最终编写了自己的groupBy 版本:毕竟我不确定Data.List 应该这样做(没有真正的文档)。
无论如何,我的测试使用我的groupBy 版本通过,而使用Data.List 失败。
我发现(感谢quickcheck)两个函数行为不同的情况,我仍然不明白为什么两个版本之间存在差异。 Data.List 版本有问题还是我的? (当然我的实现是幼稚的,可能不是最有效的方法)。
代码如下:
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'
在ghc中运行quickCheck prop_a返回["", "a", ""]
*Main> groupBy' ((==) `on` head') ["","a",""]
[["",""],["a"]] # correct in my opinion
*Main> DL.groupBy ((==) `on` head') ["","a",""]
[[""],["a"],[""]] # incorrect.
发生了什么事?我不敢相信 haskell 平台中存在错误。
【问题讨论】:
-
groupBy函数将列表分成几部分,例如concat . groupBy f == id(以及其他法律)。