我正试图找出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
减少了总和而不是长度,因此在递归时总是会抱怨。我想我会删除那个警卫,并希望用户永远不会做错。
答案 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 = ...
这将有助于您追踪...
部分中出现的问题。