Я начинаю понимать силу Haskell и то, как ленивая загрузка может быть использована такими способами, как
main = do
s <- getContents
let r = map processIt (lines s)
putStr (unlines r)
Но проблема, с которой я сталкиваюсь, заключается в расширении такого рода функций «Скажи, что в структуре данных заранее, но получи это, когда тебе это нужно», для других типов данных.
Например, у меня есть тип графика.
type Key = String
data Node = Node { key :: Key, links :: [Node] }
Я хочу написать чистый код, который действует на этом графике (алгоритмы прямого поиска), независимо от того, как он построен, но я хочу, чтобы узлы лениво заполнялись, когда я к ним добирался.
Я думаю, что мне нужен способ заранее указать, что находится на графике и как его заполнить (какое-то рекурсивное определение), но мне сложно понять, как это сделать.
Что-то вроде
loadGraph :: Key -> Node
loadGraph k =
let (key,edges) = getNodeAndEdgesFromInternetOrDatabase k in
Node key (map loadGraph edges)
Я чувствую, что это близко, но я не совсем уверен, как это сделать. Помощь и советы будут оценены. (особенно такие вещи, как тип getNodeAndEdgesFromInternetOrDatabase)