Экземпляр функции для 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 (и их может быть больше одной). Что мне кажется близким к магии. Или я думаю слишком сложно?