Если я правильно прочитал ваши комментарии, то у вас есть структура с общими значениями ~ 500 тыс. Для вычисления. Вычисления дороги, поэтому вы хотите, чтобы они выполнялись только один раз, а при последующих обращениях вы просто хотите получить значение без перерасчета.
В этом случае используйте лень Хаскелла в ваших интересах! ~ 500k не так уж и велик: просто составьте карту всех ответов, а затем извлекайте их по мере необходимости. Первая выборка вызовет вычисление, последующие выборки того же ответа будут повторно использовать тот же результат, и если вы никогда не получите определенный расчет - это никогда не произойдет!
Вы можете найти небольшую реализацию этой идеи, используя 3D точечные расстояния в качестве вычисления в файле PointCloud.hs . Этот файл использует Debug.Trace
для регистрации, когда вычисление фактически выполнено:
> ghc --make PointCloud.hs
[1 of 1] Compiling Main ( PointCloud.hs, PointCloud.o )
Linking PointCloud ...
> ./PointCloud
(1,2)
(<calc (1,2)>)
Just 1.0
(1,2)
Just 1.0
(1,5)
(<calc (1,5)>)
Just 1.0
(1,2)
Just 1.0