Как сравнить две функции?
От: /Forester/ Россия http://www.akteam.ru
Дата: 17.06.13 21:17
Оценка:
Всем привет!

Что-то не пойму как сравнить две функции

class N1
{
  Func : void -> void { get; set; }

  Foo1() : void {}
  Foo2() : void {}

  Test() : void
  {
    Func = Foo1;
    
    // Это не работает, результат сравнения false, 
    // также как и для Func.Equals(Foo1)
    if(Func == Foo1)
    {
     ...
    }
    else
    {
     ...
    }
  }
}


Есть переменная Func, которая хранит функцию. Хочется проверить, что в Func хранится именно интересующая меня функция. А то ведь может и Foo2 быть сохранена. Как это можно сделать?

PS
C# поддерживает сравнение делегатов
Re: Как сравнить две функции?
От: STDray http://stdray.livejournal.com
Дата: 17.06.13 22:22
Оценка:
F>Есть переменная Func, которая хранит функцию. Хочется проверить, что в Func хранится именно интересующая меня функция. А то ведь может и Foo2 быть сохранена. Как это можно сделать?

Полагаю, что дело в том, что это методы экземпляра объекта. Попробуйте сделать их статическими.
Re: Как сравнить две функции?
От: _NN_ www.nemerleweb.com
Дата: 18.06.13 06:36
Оценка:
Здравствуйте, /Forester/, Вы писали:

F>C# поддерживает сравнение делегатов

У функционального типа нет переопределения Equals в отличии от Equals делегата.

Компилятор вам прямым текстом это и говорит:

error: comparing values of types void -> void and void -> void with reference equality


Как вариант можно починить компилятор и добавить определение Equals в Nemerle.Builtins.Function(Void).
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Как сравнить две функции?
От: /Forester/ Россия http://www.akteam.ru
Дата: 18.06.13 07:33
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Как вариант можно починить компилятор и добавить определение Equals в Nemerle.Builtins.Function(Void).


Не, с этим мне не справится. Даже представить не могу как этот Equals должен быть реализован. В моем конкретном случае понятно, а в общем, с учетом операции над функциями, совершенно не понятно.
Re: Как сравнить две функции?
От: hardcase Пират http://nemerle.org
Дата: 18.06.13 10:40
Оценка:
Здравствуйте, /Forester/, Вы писали:

F>Что-то не пойму как сравнить две функции


Только сравнением по ссылке.

F>C# поддерживает сравнение делегатов


Nemerle тоже умеет сравнивать делегаты.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: Как сравнить две функции?
От: _NN_ www.nemerleweb.com
Дата: 18.06.13 15:16
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Только сравнением по ссылке.


Стоит ли Nemerle повторять сравнение для функциональных типов ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: Как сравнить две функции?
От: hardcase Пират http://nemerle.org
Дата: 18.06.13 15:59
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Стоит ли Nemerle повторять сравнение для функциональных типов ?


Зачем?
/* иЗвиНите зА неРовнЫй поЧерК */
Re[4]: Как сравнить две функции?
От: _NN_ www.nemerleweb.com
Дата: 18.06.13 17:42
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Здравствуйте, _NN_, Вы писали:


_NN>>Стоит ли Nemerle повторять сравнение для функциональных типов ?


H>Зачем?


С тем же зачем сравнивают делегаты.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: Как сравнить две функции?
От: nikov США http://www.linkedin.com/in/nikov
Дата: 18.06.13 18:33
Оценка: +1
Здравствуйте, /Forester/, Вы писали:

F>Не, с этим мне не справится. Даже представить не могу как этот Equals должен быть реализован. В моем конкретном случае понятно, а в общем, с учетом операции над функциями, совершенно не понятно.


Если нужно сравнение с семантикой, что функции с одинаковым поведением считаются равными, то доказано, что это алгоритмически неразрешимая задача.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.