У меня есть функция, которая получает значение из записи и устанавливает его в то же поле в другой записи.
Я хочу понять, как работают механизмы, лежащие в основе этого.
setToPercent perc basedOn toSetOn = setStat
where baseStat = basedOn ^. _func -- type is Maybe Float
percentDelta = (\a -> perc * a) <$> baseStat -- Maybe Float
setStat = toSetOn & _func %~ (\a -> (+) <$> a <*> percentDelta)
Где _func
определяется как MyDataType -> Maybe Float
(функция по умолчанию из синтаксиса записи.)
И это работает именно так, как я ожидаю. Что я хочу знать, так это сигнатуру типа _func
.
Я знаю, что здесь basedOn ^. _func
, _func
будет тип Getting (f0 Float) MyDataType (f0 Float)
и здесь toSetOn & _func %~ (\a -> (+) <$> a <*> percentDelta
, _func
будут иметь тип ASetter Weapon Weapon (f0 Float) (f0 Float)
, где данные Weapon
и MyDataType
в основном имеют один и тот же тип данных с идентичными конструкторами.
Но я не уверен, что это будет общий тип. Например, каким был бы тип функции, если бы я обобщил setToPercent
по отношению к _func
, как в
setToPercent fnToApply perc basedOn toSetOn = setStat
where baseStat = basedOn ^. fnToApply -- type is Maybe Float
percentDelta = (\a -> perc * a) <$> baseStat -- Maybe Float
setStat = toSetOn & fnToApply %~ (\a -> (+) <$> a <*> percentDelta)