Это сообщение о fgl
, обычной библиотеке графов на Haskell.
Предположим, у меня есть граф, и я хочу пометить листья, лист - это вершина без исходящих ребер,Я набрасываю тривиальный предикат для контекста:
isLeaf :: Context a b -> Bool
isLeaf (_, _, _, [ ]) = True
isLeaf (_, _, _, _ ) = False
- и затем я набрасываю одинаково тривиальную, хотя и многословную, функцию для обозначения контекста предикатом.
mark :: (Context a b -> Bool) -> Context a b -> Context (a, Bool) b
mark p x@(edgesIn, identifier, label , edgesOut)
= (edgesIn, identifier, (label, p x), edgesOut)
Что можетпойти не такИ все же.
λ ab
mkGraph [(1,'a'),(2,'b')] [(1,2,()),(2,1,())]
λ gmap (mark isLeaf) ab
mkGraph [(1,('a',False)),(2,('b',True))] [(1,2,()),(2,1,())]
ab
, будучи циклом, не имеет листьев, и все же узел отмечен. Подумав немного, я понимаю, что это связано именно с индуктивной природой функции gmap
: когда она удаляет контекст из ab
, она изменяет контекст оставшихся узлов, удаляя ребра, которыми они делятся сушел контекст.
Но это не то, что я хочу. Это дает мне стек ;что я хочу, это молния . Я хочу иметь мою симметрию . Я уверен, что смогу обойти эту проблему, но мне интересно, есть ли чистое, очевидное, стандартное решение.