Скажем, у меня есть пара функций преобразования
string2int :: String -> Maybe Int
int2string :: Int -> String
Я мог бы довольно легко представить их с помощью оптики.
stringIntPrism :: Prism String Int
Однако, если я хочу представить причину сбоя, мне нужно сохранить их как две отдельные функции.
string2int :: String -> Validation [ParseError] Int
int2string :: Int -> String`
Для этого простого примера Maybe
отлично, поскольку мы всегда можем предположить, что сбой - это сбой синтаксического анализа, поэтому нам не нужно его кодировать с использованием типа "Либо" или "Проверка".
Однако представьте, в дополнение к моей разборке Prism, я хочу выполнить некоторую проверку
isOver18 :: Int -> Validation [AgeError] Int
isUnder55 :: Int -> Validation [AgeError] Int
Было бы идеально, чтобы иметь возможность составлять эти вещи вместе, чтобы я мог
ageField = isUnder55 . isOver18 . string2Int :: ValidationPrism [e] String Int
Это довольно тривиально для создания вручную, однако, похоже, достаточно распространенная концепция, что в области линз/оптики может быть что-то скрытое. Есть ли существующая абстракция, которая обрабатывает это?
ТЛ; дг
Существует ли стандартный способ реализации частичного объектива/призмы/изо, который может быть параметризован по произвольному функтору, а не привязан непосредственно к Maybe?.
Я использовал обозначение Haskell выше, так как это более прямолинейно, однако я использую Monocle в Scala для реализации этого. Тем не менее, я был бы доволен ответом, специфичным для библиотеки ekmett Lens.