Так же, как вы создаете псевдоним типа для другого типа:
type Distance a = Num a => Vector a -> Vector a -> a
На самом деле функции являются «конструкторами типов»: если вы пишете a -> b
, в более канонической форме вы пишете (->) a b
, что означает, что вы в основном написали:
type Distance a = Num a => (->) (Vector a) ((->) (Vector a) a)
Обратите внимание, что нам нужно добавить параметр типа a
здесь, так что ваш taxicab
имеет тип:
taxicab :: Distance <b>a</b>