Я хочу представить график в 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 ошибку, которой позволяют. Что я делаю неправильно?
Две проблемы:
let
- это форма выражения, а на верхнем уровне компилятор ожидает форму объявления.
Вам нужно одно гнездо связывания; используя три 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]}
Я бы не стал представлять граф таким образом. Храните узлы в карте или массиве и ссылайтесь на них по ключам вместо прямого указания на них. Это было бы намного проще сохранять, загружать, поддерживать и работать с ними.
О некоторых проблемах с текущим представлением:
Рид Бартон прокомментировал:
Обратите внимание, что n1 и n3 совершенно неразличимы (поскольку у них одно и то же определение), что, в зависимости от вашего приложения, может быть проблемой с этим представлением.
(нет is
сравнения а-ля Python в Haskell)
Norman Ramsey заметил:
Я получаю бесконечную распечатку строки