Мне всегда казалось естественным сравнивать функции в языках с поддержкой
ФВП. Понятное дело, что сравнить ведут ли себя функции одинаково, в одинаковый
код ли они скомпилировались дело сложное и, в действительности, не нужное.
Но почему бы не сравнивать их указатели? Возвращать true
когда это
гарантированно так.
Некоторое время назад, разбираясь с Haskell я поднимал тему на ЛОРе.
Сейчас пишу небольшой проект на Go и наткнулся на ту же проблему. Даже задал вопрос в списке рассылки, и в ходе обсуждения выяснилось что это может связать руки компилятору в создании некоторых оптимизаций. (Например если компилятор захочет сделать inline).
Так что этого стоит избегать.
Пока я выяснял степень православности сравнения указателей функций, я накалякал вот такой костылик:
package main import "reflect" import "fmt" func f() {} func g() {} func equals(f, g interface{}) bool { fPtr := reflect.ValueOf(f).Pointer() gPtr := reflect.ValueOf(g).Pointer() return fPtr == gPtr } func main() { if equals(f, g) { fmt.Println("f and g are equal!") } else { fmt.Println("f and g are not equal.") } }
Ответ разумеется "f and g are not equal."
.