Итак, я думал об алгоритме расстояния графа сегодня вечером, и придумал это пока я ехал в машине:
module GraphDistance where
import Data.Map
distance :: (Ord a) => a -> Map a [a] -> Map a Int
distance a m = m'
where m' = mapWithKey d m
d a' as = if a == a' then 0 else 1 + minimum (Prelude.map (m'!) as)
Сначала я довольно гордился собой, так как она казалась такой элегантной. Но потом я понял, что это не сработает - corecursion может застрять в цикле.
Мне пришлось закодировать это, чтобы убедить себя:
ghci> distance 1 $ fromList [(0,[1]),(1,[0,2]),(2,[1,3]),(3,[2])]
fromList [(0,1),(1,0),(2,^CInterrupted.
Но теперь я думаю, что я в значительной степени обдумал это.
Есть ли список распространенных ошибок и анти-шаблонов при работе с базовыми данными, которые я могу прочитать, чтобы я мог научить свой мозг мыслящим курсивом? Опыт довольно хорошо научил меня обдумывать непрофессиональные данных, но я хотел бы поучиться на ошибках других, если смогу.