Я думаю, что @ zh5 делает правильное замечание в том смысле, что:
- это, вероятно, либо неподходящий пример для изучения на данном этапе (для всего, что вы пытаетесь достичь)
- или, если это так, вы сможете понять это, не задавая этого вопроса.
С другой стороны, попытка понять что-то просто из любопытства - это даже хорошоесли это не всегда особенно полезно, поэтому я попытаюсь помочь.
Это цель field
(я предполагаю):
Дайте мне "логика" в Decoder
, которую я могу использовать, чтобы декодировать поле и дать мне имя поля.Я возьму "логику" из вашего Decoder
, добавлю "дополнительную логику" поверх нее, чтобы найти поле в объекте JSON, и я дам вамвернем эту комбинированную логику в новую Decoder
.
Итак, эта «дополнительная логика» разделена на две части в приведенном выше коде:
attemptToDecode
захватываетлогика для гарантии того, что все, что декодируется, является объектом JSON.Значение этого объекта JSON представляется в виде словаря, который извлекается и передается во вторую часть.(Если то, что декодируется, не является объектом, результатом, очевидно, должна быть ошибка.) decodeKey
фиксирует вторую половину логики.Имея содержимое объекта JSON в форме словаря, теперь мы должны найти поле и попытаться декодировать его, используя «логику» , которая была предоставлена в Decoder
.Эта логика деконструирована из декодера и называется parameterAttempt
в коде.(Очевидно, что если поле не может быть найдено в объекте JSON, результатом должно быть сообщение об ошибке.)
Теперь attemptToDecode
относится к decodeKey
, которое затем относится к parameterAttempt
(оригиналлогика передана для декодирования поля), поэтому мы можем сказать, что attemptToDecode
захватывает всю логику, необходимую для декодирования поля из объекта JSON .Таким образом, на данный момент все, что нужно сделать, - это обернуть эту логику обратно в Decoder
, что в точности соответствует коду:
Decoder attemptToDecode
И, конечно, вы правы в своем собственном ответе, что логика, захваченная в декодерах, записывается в виде функций, и когда эти функции ссылаются друг на друга, их сигнатуры типов должны совпадать в конце.