[Haskell-beginners] Heathrow to London from lyahgg - infinite loop

Siddharth Karandikar siddharth.karandikar at gmail.com
Wed Jan 4 08:36:35 CET 2012


On Wed, Jan 4, 2012 at 11:34 AM, Brandon Allbery <allbery.b at gmail.com> wrote:
> On Tue, Jan 3, 2012 at 23:21, Siddharth Karandikar
> <siddharth.karandikar at gmail.com> wrote:
>>
>> I am trying out Heathrow to London problem given in Learn You a Haskell
>> book.
>> There is optimization tip given by author to avoid computing priceA =
>> sum $ map snd pathA every time. I was trying to implement that like
>> following -
>>
>> roadStep :: (Path, Path, Int, Int) -> Section -> (Path, Path, Int, Int)
>> roadStep (pathA, pathB, cA, cB) (Section a b c) =
>>         let forwardPriceToA = cA + a
>>             crossPriceToA = cB + b + c
>>             forwardPriceToB = cB + b
>>             crossPriceToB = cA + a + c
>>             (newPathToA, cA) = if forwardPriceToA <= crossPriceToA
>
>
> Haskell's let is recursive; you bind cA (a second time, which is often not
> wise) there, but forwardPriceToA also uses cA --- which, because you have
> introduced a local binding for cA, is going to be that local binding and not
> the one from the parameters.  (I think.)  So you get a binding that
> self-recurses forever.  Likewise for cB in the next binding.
>
> The solution should be to introduce new names for those bindings (by
> convention cA' and cB', but you can call them anything as long as they're
> different from the other names in use).
>

Yes, you are right. I am accidentally creating a recursive binding.
I introduced a new name, and it worked!

-Wall showed all the shadowing warnings. Better to keep -Wall always on. :)

Thanks!



More information about the Beginners mailing list