Как можно экспортировать запись типа данных в haskell без экспорта ее полей?

Я видел несколько более старый вопрос в Избегание загрязнения пространства имен в Haskell и ищу современный решение с помощью линз.

Я думаю, что подход будет состоять из нескольких шагов:

  1. Перепишите поля так, чтобы они подходили для линз: field -> _field.
  2. Используйте линзы.
  3. Избегайте экспорта (или, если на стороне пользователя, импорта) файла _fields.

Меня больше всего беспокоит пункт 3 в этом вопросе, так как я думаю, что смогу выяснить остальное на основе существующих ресурсов. Но, возможно, это невозможно.


person bbarker    schedule 18.01.2019    source источник
comment
Почему бы просто не называть поля и не писать отдельные функции для выборки полей?   -  person AJF    schedule 19.01.2019
comment
Почему пункт 3 касается именно вас?   -  person Daniel Wagner    schedule 19.01.2019
comment
конфликты имен становятся раздражающими: я могу себе представить, например, поле time во многих различных типах записей, и они даже означают одно и то же. Я думаю, что не называть поля может быть вариантом.   -  person bbarker    schedule 19.01.2019
comment
@bbarker В ответах на вопрос, который вы связали, обсуждается, что с этим делать ... (Используйте класс типов, префикс или импорт с квалифицированным + как.) У меня очень, очень возникает соблазн просто пометить это как дубликат этого один. Объективы существенно не меняют ответ.   -  person Daniel Wagner    schedule 19.01.2019
comment
Я думаю, что вещь, которая все еще сбивает меня с толку: скажем, у меня есть тип данных с именем Record с Record{id:: Int} - есть ли способ иметь возможность напрямую ссылаться на Record без префикса, а затем также делать что-то вроде RCD.id, где RCD - это квалифицированный импорт для использования поле id (или просто не импортировать их вообще, как говорится в моем исходном вопросе, что, я полагаю, является основным отличием от предыдущего вопроса).   -  person bbarker    schedule 19.01.2019
comment
В дополнение к квалифицированному импорту вы можете сделать неквалифицированный импорт только типа Record. import qualified ThePackage AS RCD; import ThePackage (Record)   -  person 4castle    schedule 19.01.2019
comment
@4castle - отлично, это работает. Почему-то я все еще думал, что это похоже на JVM-страну, где имена могут классифицироваться при импорте, но в Haskell (поскольку все всегда лениво?) Я полагаю, что они классифицируются только при использовании (т.е. если во время вызова возникает двусмысленность).   -  person bbarker    schedule 19.01.2019