Haskell: Common Corecursive Fallacies

Итак, я думал об алгоритме расстояния графа сегодня вечером, и придумал это пока я ехал в машине:

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.

Но теперь я думаю, что я в значительной степени обдумал это.

Есть ли список распространенных ошибок и анти-шаблонов при работе с базовыми данными, которые я могу прочитать, чтобы я мог научить свой мозг мыслящим курсивом? Опыт довольно хорошо научил меня обдумывать непрофессиональные данных, но я хотел бы поучиться на ошибках других, если смогу.

9
задан rampion 8 June 2011 в 03:05
поделиться