我要在数字上拆分的groupBy函数遇到麻烦。如果有人可以指出我要去哪里,这很有帮助
输入“ aba3dac4d”
所需的输出[“ aba”,“ 3dac”,“ 4d”]
但是我在执行代码时得到了输出
groupBy groupBy0' "aba3dac4d"
[“ aba”,“ 3dac4d”] 这是代码
import Data.List
groupBy0'::Char->Char->Bool
groupBy0' x y
| x `elem` ['a'..'z'] && y `elem` ['0'..'9'] = False
| x `elem` ['0'..'9'] && y `elem` ['a'..'z'] = True
| x `elem` ['a'..'z'] && y `elem` ['a'..'z'] = True
| x `elem` ['0'..'9'] && y `elem` ['0'..'9'] = True
| otherwise = False
答案 0 :(得分:2)
从docs:
“按”操作
按照惯例,重载函数具有未重载的对应函数 其名称后缀为
By
。与
on
一起使用这些功能通常很方便,例如 实例sortBy (compare `on` fst)
。用户提供的相等性(替换Eq上下文)
假定谓词定义了一个等价物。
因此,groupBy pred
期望pred
是等价关系,但您的不是,即违反合同,因此不能依赖结果。特别是,groupBy groupBy0' "aba3dac4d"
可能会执行以下测试:
groupBy0' 'a' 'b'
是真实的,'b'
在同一组中groupBy0' 'a' 'a'
是真实的,'a'
在同一组中groupBy0' 'a' '3'
为假, other 组中的'3'
groupBy0' '3' 'd'
是真实的,'d'
在同一组中groupBy0' '3' 'a'
是真实的,'a'
在同一组中groupBy0' '3' 'c'
是真实的,'c'
在同一组中groupBy0' '3' '4'
是真实的,'4'
在同一组中groupBy0' '3' 'd'
是真实的,'d'
在同一组中如您所见,以上groupBy
的实现,我们总是将其与组中的第一个元素进行比较,而不是与您期望的最后一个进行比较。由于pred
被认为是等价的,因此与之比较的组中的哪个元素都没有关系。如果我们打破这个假设,那就很重要。
您不能使用groupBy
来执行您的特定功能。
答案 1 :(得分:1)
正如@chi清楚地说明,您没有正确使用groupBy
。实际上,我认为groupBy
不是此处要使用的正确函数。相反,我会看takeWhile
。
答案 2 :(得分:1)
正如@chi所说,您可能不想要var my_string ="I pity the";
;但是这里有些东西可以帮助您入门:)
groupBy
答案 3 :(得分:0)
我不知道您要做什么,但是您可以使用chunksOf
import Data.List.Split
chunksOf 3 "aba3ac4d"