在使用groupBy函数时遇到麻烦

时间:2019-11-21 20:21:15

标签: haskell

我要在数字上拆分的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

4 个答案:

答案 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"