2013-12-18 3 views
0

я должен иметь следующие функции:Функция рекурсии, когда он не

followConnections :: [Connection]->Crib->Stecker->Offsets->Maybe Stecker 
followConnections [] _ y _ = Just (y) 
followConnections w x y z 
    | fC /= Nothing = trace("Follow Connections recursing") followConnections (tail w) x (fromMaybe(fC)) z 
    | fC == Nothing = trace("Follow connections fail! for " ++ show y) Nothing 
    where 
    fC = followConnection (head w) x y z 

Технически, функция должна рекурсии, если текущий элемент [Connection] не вызывает followConnection вернуть Nothing или вернуть Nothing иначе. Однако, отслеживая функцию, я увидел, что она будет возвращаться до тех пор, пока [Connection] не будет пуст, даже в какой-то момент он терпит неудачу.

Любая идея, почему это может быть?

Спасибо!

+2

Просто угадайте. Используется ли 'followConnection' (без« s »)' followConnections' (с «s»)? Или 'followConnections' вызывается более одного раза, так что вывод второго вызова выглядит как продолжение первого? – jamshidh

+2

заменить «followConnection» на Nothing. Он рекурсирует? Ищите вызов 'followConnections' из' followConnection' –

+0

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

ответ

2

Это делает намного больше смысла, чтобы написать функцию, используя поиск по шаблону и тематическое заявление, которое позволяет избежать всех вызовов на fromMaybe, head и tail, которые в настоящее время захламления вашего кода.

followConnections :: [Connection] -> Crib -> Stecker -> Offsets -> Maybe Stecker 
followConnections []  _ y _ = Just y 
followConnections (w:ws) x y z = case fC of 
    Nothing -> trace ("Fail! for " ++ show y) $ Nothing 
    Just y' -> trace ("Recursing")   $ followConnections ws x y' z 
    where 
    fC = followConnection w x y z 

С x и z фиксируются в рекурсии, он также имеет смысл писать это, используя вспомогательную функцию

followConnections ws x y z = go ws y 
    where 
    go []  y = Just y 
    go (w:ws) y = case fc of 
     Nothing -> trace ("Fail for" ++ show y) $ Nothing 
     Just y' -> trace ("Recursing")   $ go ws y' 
     where 
     fc = followConnection w x y z 

Наконец, вы можете использовать функцию maybe от Data.Maybe, чтобы избавиться от case, упрощая код еще дальше.

followConnections ws x y z = go ws y 
    where 
    go []  y = Just y 
    go (w:ws) y = maybe Nothing (go ws) (followConnection w x y z) 

Теперь, когда функция упрощается, она должна быть намного легче работать, где это происходит не так.

Смежные вопросы