Экземпляр кортежей Ord
использует лексикографический порядок, поэтому Map (a, b) c
в любом случае сначала будет сортироваться по a
, поэтому общий порядок будет таким же. Что касается практических соображений:
Поскольку Data.Map
представляет собой двоичное дерево поиска, разбиение по ключу сравнимо с поиском, поэтому получение подкарты для заданного a
в форме без карри не будет значительно дороже, чем в форме с карри.
Каррированная форма может давать в целом менее сбалансированное дерево по очевидной причине наличия нескольких деревьев вместо одного.
Каррированная форма будет иметь дополнительные накладные расходы для хранения вложенных карт.
Вложенные карты каррированной формы, представляющие «частичные приложения», могут использоваться совместно, если некоторые значения a
дают одинаковый результат.
Точно так же «частичное применение» каррированной формы дает вам существующую внутреннюю карту, в то время как некаррированная форма должна создавать новую карту.
Таким образом, форма без каррирования явно лучше в целом, но форма с карри может быть лучше, если вы планируете часто выполнять "частичное применение" и выиграете от совместного использования Map b c
значений.
Обратите внимание, что потребуется некоторая осторожность, чтобы гарантировать, что вы действительно выиграете от этого потенциального обмена; вам нужно будет явно определить любые общие внутренние карты и повторно использовать одно значение при построении полной карты.
Редактировать: Тихон Джелвис указывает в комментариях, что накладные расходы памяти на конструкторы кортежей, которые я не думал учитывать, вовсе не незначительны. Каррированная форма, безусловно, имеет некоторые накладные расходы, но эти накладные расходы пропорциональны количеству различных значений a
. Накладные расходы конструктора кортежа в форме без карри, с другой стороны, пропорциональны общему количеству ключей.
Поэтому, если в среднем для любого заданного значения a
есть три или более различных ключа, использующих его, вы, вероятно, сэкономите память, используя каррированную версию. Опасения по поводу несбалансированных деревьев, конечно, все еще актуальны. Чем больше я думаю об этом, тем больше подозреваю, что каррированная форма однозначно лучше, за исключением, возможно, случаев, когда ваши ключи очень разрежены и распределены неравномерно.
Обратите внимание, что поскольку арность определений имеет значение для GHC, такая же осторожность требуется при определении функций, если вы хотите, чтобы подвыражения были общими; это одна из причин, по которой вы иногда видите функции, определенные в таком стиле:
foo x = go
where z = expensiveComputation x
go y = doStuff y z
person
C. A. McCann
schedule
17.05.2013
Map (a, b) c
, вероятно, будет гораздо более эффективным с точки зрения памяти (и, возможно, времени). Если есть способ (я не уверен, мало использовал карты) свернуть диапазон ключей префикса, то вы все равно могли бы эффективно выполнить что-то вроде каррированного приложения с этим представлением, я думаю. - person   schedule 17.05.2013