Представление типа данных графика Haskell

Я хочу представить график в Haskell следующим образом:

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

Например, я хочу, чтобы узел ny был сохранен как („Нью-Йорк “(l p)), где l и p являются соседними узлами, и не как („Нью-Йорк “(„лондонский “„Париж “)).
Я попробовал что-то вроде этого:

data Node a = Node { value :: a
                   , neighbors :: [Node a]
                   }deriving (Show)

let n1 = Node {value=1, neighbors=[n2]}
let n2 = Node {value=1, neighbors=[n1 n3]}
let n3 = Node {value=1, neighbors=[n2]}

Но я вкладываю en ошибку, которой позволяют. Что я делаю неправильно?

5
задан Bill the Lizard 20 September 2012 в 20:59
поделиться

2 ответа

Две проблемы:

  1. let - это форма выражения, а на верхнем уровне компилятор ожидает форму объявления.

  2. Вам нужно одно гнездо связывания; используя три letа, вы разделили определения на три отдельных диапазона.

Следующий код компилируется, и когда я запрашиваю n1, я получаю бесконечную строку, как и ожидалось:

module Letnest 
where
data Node a = Node { value :: a
                   , neighbors :: [Node a]
                   } deriving (Show)

n1 = Node {value=1, neighbors=[n2]}
n2 = Node {value=1, neighbors=[n1, n3]}
n3 = Node {value=1, neighbors=[n2]}
7
ответ дан 13 December 2019 в 19:23
поделиться

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

О некоторых проблемах с текущим представлением:

Рид Бартон прокомментировал:

Обратите внимание, что n1 и n3 совершенно неразличимы (поскольку у них одно и то же определение), что, в зависимости от вашего приложения, может быть проблемой с этим представлением.

(нет is сравнения а-ля Python в Haskell)

Norman Ramsey заметил:

Я получаю бесконечную распечатку строки

4
ответ дан 13 December 2019 в 19:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: