Как выразить следующую идею в Haskell? Хотя синтаксис полностью составлен, вот что я пытаюсь достичь:Параметрированные, но безопасные по типу ключи в обработке JSON
- Моего приложения имеет высоко вложенные основные тип данных с каждым «уровнем», имеющими экземпляры FromJson/ToJson
- JSON API подача питание пользовательский интерфейс имеет возможность манипулировать отдельными «уровнями гнездования», например. для редактирования адреса вам не нужно редактировать полный заказ.
- Однако я хочу убедиться, что наряду с данными, которые были изменены пользовательским интерфейсом, полный заказ также отправляется обратно. Это гарантирует, что если редактирование привело к некоторому зависимому полю в другой части объекта, который будет изменен, он будет передан обратно в пользовательский интерфейс.
Редактировать: Основной вопрос заключается не в логике приложения, а в принципе. Основной вопрос заключается в том, как представлять ключи JSON безопасным типом, имея возможность параметризовать их. Простым решением является наличие другого конкретного типа для каждого возвращаемого типа API, например {orderItems :: [OrderItem], order :: Order}
или {address :: Address, order :: Order}
или {email :: Email, customer :: Customer}
. Но они быстро повторятся. Я хочу иметь тип данных, который представляет собой идею JSON с парой первичного ключа и пары вторичных/поддерживающих ключей, где имена ключей могут быть легко изменены.
псевдо-код, указанный ниже, является обобщением этой идеи:
data IncomingJson rootname payload = (FromJson payload, ToString rootname) => IncomingJson
{
rootname :: payload
}
data OutgoingJson rootname payload sidename sidepayload = (ToJson payload, ToString rootname, ToJson sidepayload, ToString sidename) => IncomingJson
{
rootname :: payload
, sidename :: sidepayload
}
createOrder :: IncomingJson "order" NewOrder -> OutgoingJson "order" Order Nothing()
editOrderItems :: IncomingJson "items" [OrderItem] -> OutgoingJson "items" [OrderItem] "order" Order
editOrderAddress :: IncomingJson "address" Address -> OutgoingJson "address" Address "order" Order
Возможно, вам просто нужно [объектив] (http://hackage.haskell.org/package/lens)? – freestyle
@freestyle Как может линза помочь в этой ситуации? Извините, но я едва знаю, как использовать объектив, не говоря уже о том, чтобы сгибать его до таких сложных ситуаций. –
Возможно, я вас неправильно понимаю. У вас есть типы данных, которые представляют некоторую информацию из вашего домена приложения, и приложение имеет состояние этого типа. Иногда часть этого состояния может быть изменена (например, по запросу из пользовательского интерфейса). И вы хотите иметь функции, которые манипулируют только частями этого состояния. Но после того, как они будут применены, вы хотите иметь обновленное состояние. Это правда? – freestyle