2014-01-28 9 views
3

Чтение Functional Programming in Scala, я увидел следующий псевдоним типа:Псевдонимы типа в Scala

type Const[M, B] = M 

implicit def monoidApplicative[M](M: Monoid[M]) = 
    new Applicative[({ type f[x] = Const[M, x] })#f] { 
    def unit[A](a: => A): M = M.zero 
    def map2[A,B,C](m1: M, m2: M)(f: (A,B) => C): M = M.op(m1,m2) 
    } 

Что смысл Const[M, x] здесь в качестве типа псевдонима? Я понимаю, что для создаваемого нового Applicative он имеет тип [M, B], где B указан на уровне функции.

+0

Возможный дубликат [Что такое тип лямбда в Scala и каковы их преимущества?] (Http://stackoverflow.com/questions/8736164/what-are-type-lambdas-in-scala-and-what-are -their-преимущества) –

+0

@KevinWright, ах, поэтому мой вопрос о '' type aliases' на самом деле является вопросом о 'type lamdbas' ... –

+0

Используется таким образом, да, этот конкретный псевдоним является лишь частью типа лямбда. –

ответ

2

Я не уверен, почему этот псевдоним был введен - хорошая причина вернуться к этой книге! :)

Однако смысл прост. Const - это что-то с двумя параметрами типа, где параметр второго типа не имеет значения. Я ожидаю, что он будет использоваться где-то, что ожидает конструктора типа с двумя параметрами типа, но, как это бывает, это не так.

Выражение ({ type f[x] = Const[M, x] })#f известен как типа лямбда в, и он используется здесь (и в большинстве мест, как на самом деле), чтобы преобразовать то, что принимает два параметра типа, Const, в чем-то, что берет один тип параметр!

Теперь, самое интересное заключается в том, что параметр типа принимаются игнорируются, из-за свою позицию в Const, и, вместо этого, M, который является параметром типа monoidApplicative определения используется.

Обратите внимание, что Applicative ожидает что-то, что принимает параметр типа, и здесь мы работаем с M, где существует Monoid[M]. Двумя примерами таких M будут Int и String, ни один из которых не имеет параметра типа.

Таким образом, в некотором смысле, мы обманываем Applicative обманом, где игнорируется параметр типа и конечного типа заменяется на то, что вы хотите, чтобы вы могли иметь Applicative[Int], так сказать, несмотря на Int не имея тип.

+0

'принимаемый параметр типа игнорируется' - это 'B' в' type Const [M, B] '? –

+0

@KevinMeredith Я имел в виду 'x' в' f [x] ', хотя' B', очевидно, также игнорируется. –

0

Const[M, x] не имеет особого значения, вы могли бы в равной степени включить его определение и написать { type f[x] = M }. ({ type f[x] = Const[M, x] })#f определяет функцию уровня.

+0

Не могли бы вы рассказать больше о 'функции уровня уровня', Алексей? –

+0

Ответ Дэниела С. Собраля уже объясняет это довольно хорошо. –

Смежные вопросы