Частично применяемые конструкторы типов в объявлениях экземпляров

У меня есть конструктор типов

type SimpleFcn α m = m α -> m α

и я хочу использовать его в классе, где он будет дополнительно параметризован позже. А именно,

instance A (SimpleFcn α)

В моей ситуации любые функции класса A были бы параметрическими в аргументе m.

class A β where f :: Monad m => β m
instance A (SimpleFcn α) where f x = x

Каков подходящий обходной путь для этой ситуации?


person gatoatigrado    schedule 28.08.2011    source источник
comment
Кажется, вы забыли задать реальный вопрос, или, может быть, я просто не вижу его.   -  person fuz    schedule 29.08.2011
comment
Давайте проясним, что такое объявление типа создает синоним типа, а не конструктор типа. Конструкторы типов, объявленные data, newtype, семейством данных, имеют виды и существуют как вещи уровня первого класса. Типовые синонимы не имеют видов: они не являются первоклассными вещами. Применительно к данной им сущности вещей они создают вещи. Обратите внимание, что вы можете определить синонимы любого типа, например. тип Foo = Map Int. Вы можете использовать Foo в экземпляре (например, Functor Foo), потому что он применяется к заданным параметрам синонима типа, хотя Foo действительно может применяться к типу.   -  person pigworker    schedule 29.08.2011
comment
@pigworker: Вы должны превратить это в ответ.   -  person hammar    schedule 29.08.2011
comment
Я бы сказал, что синонимы типов имеют виды. Просто попробуйте использовать его неправильно, и вы получите добрую ошибку.   -  person augustss    schedule 29.08.2011
comment
@augustss Какой пример неправильного использования синонимов типов?   -  person is7s    schedule 29.08.2011
comment
@is7s Неверное определение: type T x = (x, x Int). Неправильное использование type T = Int; x :: T Bool. Синоним типа имеет вид, но также имеет арность (количество аргументов в определении). Он всегда должен использоваться как минимум с таким же количеством аргументов, как и в определении. Например, type L1 x = [x]; type L2 = [] похожи, но L1 всегда нужен аргумент, поэтому instance Monad L1 неверно, тогда как instance Monad L2 в порядке.   -  person augustss    schedule 29.08.2011
comment
@pigworker: с расширением синонимов либерального типа GHC может стать труднее обосновать эту точку зрения - они все еще не являются первоклассными объектами и не могут использоваться, как в вопросе, но вы можете частично применить их достаточно, чтобы делать такие вещи, как напишите числовую арифметику Черча, используя только синонимы типов. По крайней мере, похоже, что у них должны быть типы в каком-то разумном смысле.   -  person C. A. McCann    schedule 30.08.2011


Ответы (1)


Невозможно частично применить синонимы типов, так как это просто способ сократить ваш код, а не настоящие лямбда-выражения на уровне типов. Вместо этого вы можете попробовать использовать newtype.

person fuz    schedule 28.08.2011