2

Например, имеется следующий тип данных:

data AnalogImpuls = AnalogImpuls{ amplitude :: Float,
                                  fade_function :: Float -> Float -> Float
                                } 

Существует ли возможность слелать поле fade_function Float -> Float вместо Float -> Float -> Float так, чтобы в качестве одного параметра автоматически применялось значение amplitude? Что-то вроде

fade_function x = amplitude this + x

, где this это как текущий объект из ООП языков.

Я новичок в Хаскелле, так что прошу сильно не бить :)

1 Answers1

1

Можно, только писать придётся в стиле Python:

data AnalogImpuls = AnalogImpuls{ amplitude :: Float }
fade_function :: AnalogImpuls -> Float -> Float
fade_function self x = amplitude(self) + x

fade_function при этом как элемент структуры включать не надо, если он не должен специально задаваться для каждого её экземпляра.

Вызывать тоже придётся либо в стиле:

impuls `fade_function` value

Либо определять операцию обращения к элементам и методам структур ~>:

object ~> method = method object

и вызывать

impuls~>fade_function value

Тогда и fade_function можно переписать в виде:

fade_function self x = self~>amplitude + x
  • Тут функция использовалась как член структуры для достижения полиморфизма, чтобы можно было разным сигналам установить разные функции, но сам вызов осуществлялся бы одинаково для всех – Shadasviar Oct 18 '16 at 17:23
  • если весь перечень типов известен заранее, то можно сделать это через "сложение типов": data Impuls = AudioImpulse {...} | ElectricImpulse {...} и описать функцию для каждого случая. Если нет, то классы и, если надо объекты разного типа укладывать в один список/вектор/ассоциативный массив, то ещё и экзистенциальные типы. – Alexander Razorenov Oct 19 '16 at 07:06