Следует ли лифтинг в функциональном программировании строгим правилам?

Я изучил «подъемные» вопросы и ответы, примеры, которые мне показались, функция подъема такая же, как и любая функция преобразования, которая меняет форму (например, преобразование монады).

Я пропустил какую-либо точку или функция подъема («концепция подъема») имеет какие-либо правила?

Если нет, то это просто концепция в функциональных преобразованиях?


person altayseyhan    schedule 10.07.2017    source источник
comment
Можете ли вы привести один или несколько конкретных примеров подъема чего-либо где-либо? О какой трансформации вы говорите? У меня проблемы с отслеживанием.   -  person Bergi    schedule 11.07.2017
comment
например stackoverflow.com/questions/17965059/what-is- lift-in-scala val pf: PartialFunction[Int, Boolean] = { case i if i › 0 =› i % 2 == 0} затем вызов pf.lift   -  person altayseyhan    schedule 11.07.2017
comment
Правила подъема зависят от того, что означает подъем. Если подъем означает liftM, то правила — это Functor законы, потому что liftM — это другое название fmap.   -  person Rein Henrichs    schedule 11.07.2017
comment
Я думаю, вы пытаетесь обобщить то, что нельзя обобщить. Пример Scala поднимает функцию в более крупную область. Пример Haskell — подъем трансформера монад. Также есть liftM, который переводит функцию в область действия функтора. Каждый из них сам по себе следует правилам, но название — это просто совпадение. Например, когда объектно-ориентированные программисты и функциональные программисты имеют в виду совершенно разные вещи, когда говорят о композиции.   -  person Silvio Mayolo    schedule 11.07.2017
comment
К сожалению, lift — это одно из тех слов, которые означают то, что хочет сказать говорящий (hoist — другое слово), хотя обычно оно имеет некоторый оттенок использования чего-то в более широком контексте.   -  person Benjamin Hodgson♦    schedule 11.07.2017
comment
Поднятие обычно относится к инъекциям. Самые простые примеры (я могу придумать) инъекций — это Left :: a -> Either a b, Right :: b -> Either a b и Identity :: a -> Identity (тривиальный). lift (из MonadTrans), liftM и примеры scala в связанном вопросе - все это инъекции. (Кроме того, все заявления о том, что лифт означает все, что вы хотите, глупы. Очевидно, что слово означает все, что вы выбрали! Но очевидно, что существует общепонятная основная концепция)   -  person user2407038    schedule 11.07.2017
comment
@ user2407038, обычно, но не всегда. data U2 m a = U2 instance MonadTrans U2 where lift _ = U2 определяет вполне допустимый экземпляр MonadTrans, но не инъекцию. То же самое относится к liftM/fmap тривиальному функтору. Приемистости также явно недостаточно для большинства ощущений подъемной силы. Так что я не думаю, что инъективность действительно имеет к этому какое-то отношение.   -  person dfeuer    schedule 15.07.2017


Ответы (1)


Подъем не меняет «форму», а только «тип». Под этим я подразумеваю, что преобразование функции, например, в List<A> приводит к List<B>. Форма (List) не меняется, но может меняться конкретный тип.

Вы правы, что это похоже на любую другую трансформацию. По сути, стандартная операция map представляет собой механизм «поднятия» функции одной переменной в функтор (с отображением типа данных). Итак, вы можете думать о map как о lift1, тогда у вас есть lift2 (для функций двух переменных) и т. д.

person melston    schedule 13.07.2017