Я не уверен, почему этот псевдоним был введен - хорошая причина вернуться к этой книге! :)
Однако смысл прост. Const
- это что-то с двумя параметрами типа, где параметр второго типа не имеет значения. Я ожидаю, что он будет использоваться где-то, что ожидает конструктора типа с двумя параметрами типа, но, как это бывает, это не так.
Выражение ({ type f[x] = Const[M, x] })#f
известен как типа лямбда в, и он используется здесь (и в большинстве мест, как на самом деле), чтобы преобразовать то, что принимает два параметра типа, Const
, в чем-то, что берет один тип параметр!
Теперь, самое интересное заключается в том, что параметр типа принимаются игнорируются, из-за свою позицию в Const
, и, вместо этого, M
, который является параметром типа monoidApplicative
определения используется.
Обратите внимание, что Applicative
ожидает что-то, что принимает параметр типа, и здесь мы работаем с M
, где существует Monoid[M]
. Двумя примерами таких M
будут Int
и String
, ни один из которых не имеет параметра типа.
Таким образом, в некотором смысле, мы обманываем Applicative
обманом, где игнорируется параметр типа и конечного типа заменяется на то, что вы хотите, чтобы вы могли иметь Applicative[Int]
, так сказать, несмотря на Int
не имея тип.
Возможный дубликат [Что такое тип лямбда в Scala и каковы их преимущества?] (Http://stackoverflow.com/questions/8736164/what-are-type-lambdas-in-scala-and-what-are -their-преимущества) –
@KevinWright, ах, поэтому мой вопрос о '' type aliases' на самом деле является вопросом о 'type lamdbas' ... –
Используется таким образом, да, этот конкретный псевдоним является лишь частью типа лямбда. –