Я читал A wreq tutorial:Как можно «реализовать» композиционные линзы Хаскелла с использованием функционального состава с этим странным порядком аргументов?
Линза обеспечивает способ сосредоточиться на части стоимости Haskell. Например, для модели тип
Response
имеет объективresponseStatus
, который фокусируется на информации о состоянии, возвращаемой сервером.ghci> r ^. responseStatus Status {statusCode = 200, statusMessage = "OK"}
^.
оператор принимает значение в качестве первого аргумента, линз, как его вторых, и возвращает часть стоимости сосредоточена на линзе.Мы составляем объективы с использованием функционального состава, который позволяет нам легко сфокусироваться на части глубоко вложенной структуры.
ghci> r ^. responseStatus . statusCode 200
Я не могу придумать способ, как функция состава делается с этим порядком аргументов может относиться к вложенности структуры в этом порядке.
Посмотрите: r ^. responseStatus . statusCode
может быть r ^. (responseStatus . statusCode)
или (r ^. responseStatus) . statusCode
.
В первом говорится, что мы построим функцию, которая первых лечит statusCode
(получает его из записи Status
- как я могу вывести из показываемого значения Status {statusCode = 200, statusMessage = "OK"}
), а затем передает его в responseStatus
, которые должны лечить статус ответа. Итак, это наоборот: на самом деле код состояния является частью статуса ответа.
Второе чтение также не имеет смысла для меня, потому что оно также относится к коду состояния.
'statusCode' должен быть объективом, а не селектором поля записи. Я думаю, они, должно быть, спрятали селектор поля и экспортировали объектив с тем же именем; довольно запутанным, если вы спросите меня. (Или написал пользовательский экземпляр Show.) –
@ReidBarton Это должно быть частью головоломки. Поскольку я очень мало знаю об объективах, мой вопрос также связан с основной идеей: как нормальная функциональная композиция может использоваться для доступа к структуре в обратном порядке? (Это немного напоминает стиль продолжения прохождения). –
Это по существу правильно. Линзы являются похожими на вычисления CPS, поэтому они, как побочный эффект, включают функцию флип-функции. –