Мертвый клоун с функциональной структурой данных - PullRequest
3 голосов
/ 06 декабря 2011

здесь мы идем с проблемой:

У меня есть агентство клоунов со многими клоунами, идущими на разные вечеринки.Некоторые идут на одну вечеринку.И я веду журнал с кем пошел на какую вечеринку.Затем у меня есть мертвый клоун, но мне нужно разобрать логи, чтобы узнать, какие люди будут расследовать, клоуны и другие люди в партии, но также нужны все партии и клоуны, связанные с мертвым клоуном (все клоуны, которые были впредыдущие партии, в которых участвовал клоун).

В принципе, я думал о том, чтобы делать это с графиками, но, возможно, это не лучшая идея, графики довольно сложны для использования в этой задаче.

Мои журналы выглядят так:

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

Как вы думаете, это будет хорошая структура данных для преобразования списка и его анализа?

Ответы [ 2 ]

3 голосов
/ 06 декабря 2011

Вот функциональное решение, использующее функцию Seq.groupBy

logs |> Seq.groupBy (function |Move(clown,party) -> party) |> Map.ofSeq

, которое даст вам Map<Party,Clown list>, который вы можете легко запросить, чтобы найти, какие клоуны и на какой стороне.

1 голос
/ 06 декабря 2011

Вы правы, что графики довольно сложны, но это в основном, когда вы разрабатываете граф общего назначения. В вашем случае, я бы сказал, что график все еще является лучшим способом, так как это напрямую моделирует ситуацию.

Я не уверен, как это сделать в функциональной парадигме, но вот идея в старом добром императивном стиле:

  1. Дайте каждому из ваших n клоунов и число от 0 (включительно) до n (исключая). Они будут служить индексами массива
  2. Создание массива n * n, инициализированного для всех нулей.
  3. Когда планируется вечеринка, для каждой пары клоунов в партии (с номерами i и j) установите для ячейки i,j и j-i 1

Когда вам дадут мертвого клоуна, все, что вам теперь нужно будет сделать, это прочитать строку, соответствующую номеру мертвого клоуна. В ячейках с 1 будет указано, какие клоуны посещали вечеринки с мертвым клоуном.

Я думаю, что приведенное выше описание показывает, что графики не должны быть сложными, если они настроены для конкретной ситуации. Опять же, я не уверен, насколько хорошо графы проявляются в функциональном программировании, поэтому, если ваша цель состоит в том, чтобы сделать все в функциональном стиле, граф может быть намного более сложным.

...