【发布时间】:2019-05-26 17:41:17
【问题描述】:
我在概念化 haskell 的 99 个问题 https://wiki.haskell.org/99_questions/Solutions/27 中问题 27 的给定答案时遇到了困难。
问题: " 将集合的元素分组为不相交的子集。
a) 一个 9 人的小组在 2、3 和 4 人的 3 个不相交的小组中可以有多少种工作方式?编写一个函数,生成所有可能性并在列表中返回它们。
例子:
* (group3 '(aldo beat carla david evi flip gary hugo ida))
( ( (ALDO BEAT) (CARLA DAVID EVI) (FLIP GARY HUGO IDA) )
... )
b) 以我们可以指定组大小列表的方式概括上述谓词,并且谓词将返回组列表。 "
他们给出的答案是这样的:
combination :: Int -> [a] -> [([a],[a])]
combination 0 xs = [([],xs)]
combination n [] = []
combination n (x:xs) = ts ++ ds
where
ts = [ (x:ys,zs) | (ys,zs) <- combination (n-1) xs ]
ds = [ (ys,x:zs) | (ys,zs) <- combination n xs ]
group :: [Int] -> [a] -> [[[a]]]
group [] _ = [[]]
group (n:ns) xs =
[ g:gs | (g,rs) <- combination n xs
, gs <- group ns rs ]
我在理解第一部分(定义函数“组合”的部分)如何运作时遇到了很多麻烦。 我对 haskell 也很陌生,所以请像我五年级一样向我解释它。
感谢任何反馈。
【问题讨论】:
标签: haskell recursion functional-programming