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