У меня есть функция, которая берет данные и возвращает те же данные или слегка измененную версию.Эффективность равенства в Haskell
Я хочу, чтобы моя программа выполняла одну вещь, если она изменилась или другая вещь, если она не изменилась.
Раньше я возвращал пару (Bool,Object)
и использовал fst
, чтобы проверить, не изменилось ли оно. В последнее время мне пришло в голову, что я могу упростить код, просто вернув объект и проверив равенство, используя ==
.
Но потом я понял, что Хаскелл не проводит различия между проверкой глубокого равенства и «идентичностью объекта» (т. Е. Равенством указателя). Итак, как я могу узнать, будет ли использование ==
эффективным или нет? Должен ли я избегать этого по соображениям эффективности, или есть случаи, когда я могу зависеть от компилятора, выясняя, что ему не нужно делать глубокую проверку равенства?
Обычно я не буду слишком беспокоиться об эффективности при написании начальной программы, но это влияет на интерфейс моего модуля, поэтому я хочу, чтобы это было правильно, прежде чем писать слишком много кода, и, похоже, это не стоит сделать программу намного менее эффективной только для небольшого фрагмента кода. Более того, я хотел бы получить лучшее представление о том, какие оптимизации я могу зависеть от GHC, чтобы помочь мне.
Как примечание, это похоже на лучший случай либо для значения «Либо», либо для чего-то эквивалентного, но более семантического (например, «data ChangeState a = Same a | Changed a»). – Chuck
Неплохая идея, отметили. – Steve