Почему линза включает в себя Iso для fromEnum / toEnum, а не для показа / чтения? - PullRequest
0 голосов
/ 04 июня 2018

Предположим, вы объявляете два изоморфизма

showing :: (Read a, Show a) => Iso' String a
showing = iso read show

reading :: (Read a, Show a) => Iso' a String
reading = iso show read

Они небезопасны, не каждая строка будет анализироваться как a.

Возникает вопрос: почему эти два не включены в библиотеку, если enum = iso fromEnum toEnum есть?

Это так же небезопасно и не может быть предотвращено системой типов.Все они переносят бремя на программиста, который должен гарантировать, что преобразование не нарушит изоморфизм.

Быстрый пример: under enum (+1) True вызовет исключение

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Помимо отличных комментариев в другом ответе, я бы сомневался в законности этих определений.Для стандартных экземпляров, где они определены, fromEnum . toEnum (и наоборот) фактически равно id.Но show . read нет, даже для полностью определенных значений и использования только стандартных экземпляров, потому что он канонизирует форматирование и круглые скобки:

> show (read "(5)" :: Int)
"5"
Data.Tree> show (read "Node     {      rootLabel=3 ,subForest=[]}" :: Tree Int)
"Node {rootLabel = 3, subForest = []}"
0 голосов
/ 04 июня 2018

Предупреждение: следует умозрительный ответ.

Одно из различий между двумя сценариями, о которых я могу подумать, заключается в том, что довольно легко прояснить, когда toEnum ломается (цитируя lens docs : «это только изоморфизм от фактически используемого числового диапазона»), в то время как все немного мрачнее, когда дело доходит до read.Другое отличие состоит в том, что toEnum - это метод Enum (и тот, который требуется в минимальном определении экземпляра), в то время как read на самом деле не является методом Read, и поэтому в некотором смыслеменее существенным (на самом деле base docs явно препятствует его использованию ).

На более общей ноте, когда дело доходит до выбора между выставлением пули -защищенный интерфейс и включая полезные, но потенциально небезопасные или незаконные комбинаторы, lens обычно подходит для последних, делая их доступными для тех, кто желает их использовать, признавая любые потенциальные проблемы в документации (или, в случаях с более опаснымив именах функций и модулей).Учитывая, что lens является библиотекой очень общего назначения, такой подход можно рассматривать как неубежденный выбор - в таком контексте может быть трудно компенсировать отсутствие комбинаторов.

PS: Также стоит отметить, что объектив кодирует read и show через _Show призму ._Show эквивалентно prism' show readMaybe и является безопасным в отношении чётности Read -ing значений.

...