После прочтения http://learnyouahaskell.com/ Я до сих пор не понимаю, как сложны структуры данных в Haskell.
Один пример:
У меня много мест, каждое место может содержать ровно один элемент. Каждый элемент может располагаться в одном месте. У местоположений и предметов есть имя и дополнительная информация (я оставляю их здесь). Каждое место и каждый элемент уникален по имени.
Эта проблема находится в контексте проблемы оптимизации, где должен быть составлен список коротких транспортов. Это означает, что объекты просто читаются один раз, а затем они никогда не обрабатываются. Существует больше типов, которые все связаны друг с другом полями экземпляра в объектно-ориентированном дизайне.
Моя первая мысль (по моему знанию объектно-ориентированного дизайна) заключалась в следующем:
data Location = Location String Item
data Item = Item String Location
Поскольку ссылок нет, только значения в Haskell, я ожидаю, что это бесконечная рекурсия.
data Location = Location String Item
data Item = Item String
При таком подходе я не могу получить местоположение, когда у меня есть только этот элемент.
Моя вторая мысль:
data Location = Location String
data Item = Item String
type LocItems = [(Location, Item)]
Ну, таким образом я должен дать методы, которым нужен элемент местоположения, два параметра: Местоположение и карта. Когда он становится более сложным, я получаю много карт. Вторая причина такого подхода: система типов не ограничивает местоположения и элементы, которые должны быть связаны только с одним из других. Карта (или лучший ассоциативный список) может сопоставить одно местоположение со многими элементами.
Я не понимаю, как такие сложные структуры построены в Haskell.
Итак, как можно построить такую структуру данных в Haskell?