Lambda для выражений типа в Haskell?

Имеет ли Haskell или конкретный компилятор что-нибудь вроде lambda типа (если это даже термин)?

Чтобы уточнить, скажем, у меня есть параметризованный тип Foo ab и хочу, чтобы Foo _ b был экземпляром, скажем, Functor. Есть ли какой-нибудь механизм, который позволил бы мне сделать что-то похожее на

 instance Functor (\a -> Foo ab) where ... 

?

От TypeCompose:

 newtype Flip (~>) ba = Flip { unFlip :: a ~> b } 

http://hackage.haskell.org/packages/archive/TypeCompose/0.6.3/doc/html/Control-Compose.html#t:Flip

Кроме того, если что-то есть Functor в двух аргументах, вы можете сделать его бифунтером:

http://hackage.haskell.org/packages/archive/category-extras/0.44.4/doc/html/Control-Bifunctor.html

(или в более поздней версии категории – более общая версия: http://hackage.haskell.org/packages/archive/category-extras/0.53.5/doc/html/Control-Functor.html#t:Bifunctor )

В то время как sclv ответил на ваш прямой вопрос, я добавлю в сторону, что существует более чем одно возможное значение для «lambda уровня типа». Haskell имеет множество операторов типа, но ни один из них не ведет себя как надлежащие лямбды:

  • Конструкторы типов: абстрактные операторы типов, которые вводят новые типы. Учитывая тип A и конструктор типов F , приложение FA приложения также является типом, но не содержит дополнительной информации типа (типа), чем «это F применяется к A ».
  • Полиморфные типы: Тип, подобный a -> b -> a неявно означает forall a b. a -> b -> a forall a b. a -> b -> a . forall связывает переменные типа в своей области действия, таким образом, ведет себя как lambda. Если память служит мне, это примерно «столичная lambda» в System F.
  • Синонимы типов: ограниченная форма операторов типов, которые должны быть полностью применены, и могут создавать только базовые типы и конструкторы типов.
  • Классы типов: по существу функции от типов / типов конструкторов до значений, с возможностью проверки аргумента типа (т. Е. Путем сопоставления шаблонов в конструкторах типа примерно так же, как совпадение регулярных функций с конструкторами данных) и для определения членства предикат по типам. Они по большей части более похожи на регулярную функцию, но очень ограничены: типы classов не являются первоclassными объектами, которые можно манипулировать, и они работают с типами только как входные (не выводятся), а значения только в качестве вывода ( определенно не вход).
  • Функциональные зависимости. Наряду с некоторыми другими расширениями они позволяют типам classов неявно создавать типы в качестве результатов, которые затем могут использоваться в качестве параметров для других classов classов. Все еще очень ограниченный, например, будучи неспособным принимать другие типы classов в качестве аргументов.
  • Типы семейств: альтернативный подход к выполнению функциональных зависимостей; они позволяют определять функции по типам, которые выглядят намного ближе к регулярным функциям уровня ценности. Однако обычные ограничения все же применяются.

Другие расширения ослабляют некоторые из упомянутых ограничений или предоставляют частичные обходные пути (см. Также: хакерство типа Олега). Тем не менее, в значительной степени одна вещь, которую вы не можете сделать нигде, – это именно то, о чем вы просили, а именно ввести новую область привязки с анонимной абстракцией функции.

Мне не нравится идея ответить на мой собственный вопрос, но, по-видимому, по словам нескольких людей на #haskell на Freenode, у Haskell нет ямб.

EHC (и, возможно, его преемник, UHC) имеет лямбды на уровне типа, но они недокументированы и не столь мощны, как на языке с зависшим от языка. Я рекомендую использовать язык с надписью, такой как Agda (аналогичный Haskell) или Coq (другой, но по-прежнему чистый функционал по своему ядру, и его можно интерпретировать и компилировать либо лениво, либо строго!) Но я склонен к таким языкам , и это, вероятно, 100x overkill за то, что вы просите здесь!

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

 data Foo ab = Foo ab type FooR ab = Foo ba instance Functor (FooR Int) where ... 

Но даже с -XTypeSynonymInstances -XFlexibleInstances это не работает; GHC ожидает, что тип syn будет полностью применен в голове экземпляра. Может быть какой-то способ организовать его с типами семейств.

Да, что сказал Гейб, на что в некотором роде отвечают типовые семьи:

http://www.haskell.org/haskellwiki/GHC/Type_families

  • C # => оператор?
  • преобразование .net Func в .net Expression <Func >
  • Java 8 Lambda Expressions - о нескольких методах в вложенном classе
  • Необязательный orElse Необязательный в Java
  • Вывод типа отражения на Java 8 Lambdas
  • Фильтровать stream Java до 1 и только 1 элемент
  • Как скомпилировать jambda-функции Java?
  • Выражение Lambda с использованием предложения Foreach
  • Ява-выражение Java 8 и значения первого classа
  • Почему плохо использовать переменную итерации в выражении lambda
  • Использование опций Java 8 с Stream :: flatMap
  • Давайте будем гением компьютера.