Как работает это определение ArrowLoop.loop?

Экземпляр функции для ArrowLoopсодержит

loop :: ((b,d) -> (c,d)) -> (b -> c)
loop f b = let (c,d) = f (b,d) in c

Во-первых, у меня проблема с подписью: как мы можем получить b -> cиз (b,d ) -> (c,d)? Я имею в виду, что cв результирующем кортеже может зависеть от обоих элементов ввода, как можно "отсечь" влияние d?

Во-вторых, я не понимаю, как здесь работает let. Не содержит (c,d) = f (b,d)циклическое определение для d? Откуда d? Честно говоря, я удивлен, что это допустимый синтаксис, поскольку похоже, что мы как бы переопределяем d.

Я имею в виду, что в математике это имело бы смысл, например. f может быть сложной функцией, но я бы предоставил только действительную часть b, и мне нужно было бы выбрать мнимую часть d таким образом, чтобы она не менялась, когда я оцениваю f (b, d), что сделало бы ее какая-то фиксированная точка. Но если эта аналогия верна, выражение letдолжно каким-то образом «искать» эту фиксированную точку для d (и их может быть больше одной). Что мне кажется близким к магии. Или я думаю слишком сложно?

22
задан Landei 24 March 2012 в 22:48
поделиться