Я изучаю Haskell и реализую алгоритм для класса. Это работает хорошо, но требование класса состоит в том, чтобы я вел подсчет общего количества раз, которое я умножил или добавил два числа. Это то, для чего я бы использовал глобальную переменную в других языках, и я понимаю, что это анафема для Хаскелла.
Один вариант - просто заставить каждую функцию возвращать эти данные вместе с их фактическим результатом. Но это не кажется забавным.
Вот то, о чем я думал: предположим, у меня есть какая-то функция f :: Double -> Double
. Могу ли я создать тип данных (Double, IO)
, а затем использовать функтор для определения умножения на (Double, IO)
, чтобы выполнить умножение и записать что-то в IO. Тогда я мог бы передать мои новые данные в мои функции просто отлично.
Имеет ли это какой-то смысл? Есть ли более простой способ сделать это?
РЕДАКТИРОВАТЬ: Чтобы быть более понятным, на языке ОО я бы объявил класс, который наследуется от Double
, а затем переопределить операцию *
. Это позволило бы мне не переписывать сигнатуру типа моих функций. Мне интересно, есть ли способ сделать это в Хаскеле.
В частности, если я определю f :: Double -> Double
, тогда я смогу сделать functor :: (Double -> Double) -> (DoubleM -> DoubleM)
правильно? Тогда я могу сохранить свои функции такими же, как сейчас.