Я пытаюсь реализовать граф объектов в Haskell, и у меня есть простой тип Node
, который содержит идентификатор и список подключенных узлов.
data Node = Node Integer [Node] deriving (Show)
Моя проблема связана с этими типами, в частности с получением значений. Например, я хочу посмотреть на значение Integer
внутри узла; возможно найти предмет с id = 0
nodes = [Node 0 []]
[n | n <- nodes, fst n == 0]
• Couldn't match expected type ‘(Integer, b0)’
with actual type ‘Node’
• In the first argument of ‘fst’, namely ‘n’
In the first argument of ‘(==)’, namely ‘fst n’
In the expression: fst n == 0
Хорошо, поэтому я не могу использовать fst
. Я тоже не могу использовать !!
. Я могу написать функцию, которая вытягивает значение наподобие
nodeId :: Node -> Integer
nodeId (Node i _) = i
и теперь [n | n <- nodes, nodeId n == 0]
будет работать.
Есть ли другой способ получить значения из типов данных, подобных этому? Это правильный шаблон?