问题又来了:
我有一家小丑经纪公司,有很多小丑去参加不同的派对。有些人去同一个聚会。我还记录了每个人都去了哪个派对。然后,我有一个死去的小丑,但我需要解析日志以获得要调查的人,小丑和派对中的其他人,但还需要与死亡小丑相关的所有派对和小丑(小丑参加过的所有小丑)。基本上,我想过用图表来做,但也许这不是最好的主意,在这个问题中使用图表是相当复杂的。
我的日志如下:
type Action =
| Move of Clown * Party
let logs = Action list
你认为它会是一个很好的数据结构来转换列表和解析它?
这是一个功能解决方案,使用Seq.groupBy
函数
logs |> Seq.groupBy (function |Move(clown,party) -> party) |> Map.ofSeq
这将给你一个Map<Party,Clown list>
,你可以很容易地查询哪个小丑在哪个派对上。
你是对的,图是非常复杂的-但这主要是当你开发一个通用的图。在你的情况下,我想说图表仍然是最好的方法,因为它可以直接模拟情况。
我不确定如何在函数式范例中做到这一点,但这是老式命令式风格的想法:
- 给出每个
n
小丑和从0
(包括)到n
(不包括)的数字。这些将作为数组索引 创建一个 - 计划聚会时,对于聚会中的每一对小丑(编号
i
和j
),将i,j
-th和j-i
-th单元格设置为1
n * n
数组,初始化为全零。当你得到一个死去的小丑,你现在所要做的就是读取与死去的小丑的数字相对应的行。有1的细胞会告诉你哪些小丑和死去的小丑一起参加了派对。
我认为上面的描述表明,如果图形是为特定情况设置的,那么它们不一定是复杂的。然后,我不确定图形在函数式编程中表现得有多好,所以如果您的目标是用函数式风格做所有事情,那么图形可能要复杂得多。