永远从守卫回归真实

时间:2012-01-12 15:11:16

标签: haskell

我正试图找出99个Haskell问题Problem 27的解决方案 这就是我希望的方式:

  group :: (Eq a) => [Int] -> [[a]] -> [[[[a]]]]
  group []     _  = []
  group (i:is) xs 
    | sum (i:is) /= length xs = error "invalid arguments"
    | otherwise               = ...

链接中的一个例子:

  

组[2,2,5] [“aldo”,“beat”,“carla”,“david”,“evi”,“flip”,“gary”,“hugo”,“ida”]
      [[[ “醛”, “拍”],[ “卡拉”, “大卫”],[ “EVI”, “炫”, “盖瑞”, “雨果”, “伊达”]] ...]        (总共756个解决方案)

因此,我想首先检查Int列表的总和是否等于上面的长度字符串列表。我遇到的是,无论两个值是否相等,它总是打印“无效参数”。我也试过这个:

group (i:is) xs 
     | (sum (i:is) == length xs) = ...
     | otherwise                 = error "invalid arguments"

仍然无效  有什么想法吗?

更新:谢谢你们,我的粗心大意。这是函数的递归部分:

 group (i:is) xs 
     | (sum (i:is) == length xs) = filter (/= []) $ concatGroups (combinations i xs) (group is xs)
     | otherwise                 = error ("invalid arguments: " ++ show (sum(i:is)) ++ "/=" ++ show(length xs))

正如您所知,group is xs减少了总和而不是长度,因此在递归时总是会抱怨。我想我会删除那个警卫,并希望用户永远不会做错。

1 个答案:

答案 0 :(得分:1)

如果您将代码更改为

,请扩展hammar的观点
group :: (Eq a) => [Int] -> [[a]] -> [[[[a]]]]
group []     _  = []
group (i:is) xs 
  | sum (i:is) /= length xs = error ("invalid arguments to group: sum "
                                     ++ show (i:is) ++ " /= " ++ show (length xs))
  | otherwise               = ...

这将有助于您追踪...部分中出现的问题。