Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 具有功能数据结构的死小丑_F#_Functional Programming - Fatal编程技术网

F# 具有功能数据结构的死小丑

F# 具有功能数据结构的死小丑,f#,functional-programming,F#,Functional Programming,下面是问题: 我有一家小丑经纪公司,有很多小丑参加不同的派对。有些人参加同一个聚会。我和参加哪个派对的人有个记录。 然后,我有一个死去的小丑,但我需要解析日志以获得要调查的人、小丑和派对中的其他人,还需要所有派对和与死去的小丑相关的小丑(小丑参与过的之前派对中的所有小丑) 基本上,我已经考虑过用图形来解决这个问题,但这可能不是最好的主意,因为在这个问题中使用图形是非常复杂的 我的日志如下: type Action = | Move of Clown * Party let logs = A

下面是问题:

我有一家小丑经纪公司,有很多小丑参加不同的派对。有些人参加同一个聚会。我和参加哪个派对的人有个记录。 然后,我有一个死去的小丑,但我需要解析日志以获得要调查的人、小丑和派对中的其他人,还需要所有派对和与死去的小丑相关的小丑(小丑参与过的之前派对中的所有小丑)

基本上,我已经考虑过用图形来解决这个问题,但这可能不是最好的主意,因为在这个问题中使用图形是非常复杂的

我的日志如下:

type Action = 
  | Move of Clown * Party
let logs = Action list

你认为转换列表并解析它会是一个好的数据结构吗?

你是对的,图形非常复杂,但这主要是在开发通用图形时。在你的例子中,我想说的是,图形仍然是最好的方式,因为它将直接模拟情况

我不知道如何在功能范式中做到这一点,但这里有一个好的老式命令式的想法:

  • 给每个
    n
    小丑和编号从
    0
    (包括)到
    n
    (排除)。这些将用作数组索引
  • 构建一个
    n*n
    数组,初始化为全零
  • 当计划派对时,派对中每对小丑(数字为
    i
    j
    ),将
    i,j
    -th和
    j-i
    -th单元格设置为1
  • 当你收到一个死去的小丑时,你现在要做的就是读取对应于死去小丑编号的行。带1的牢房会告诉你哪些小丑和死去的小丑一起参加派对


    我认为上面的描述表明,如果图表是针对特定情况设置的,那么它们不必很复杂。再说一遍,我不确定图形在函数式编程中表现得有多好,因此如果您的目标是以函数式风格完成所有工作,那么图形可能要复杂得多。

    下面是一个函数式解决方案,使用
    Seq.groupBy
    函数

    logs |> Seq.groupBy (function |Move(clown,party) -> party) |> Map.ofSeq
    
    这将为您提供一张
    地图
    ,您可以轻松查询该地图,以查找哪些小丑参加了哪场派对