Мне кажется, что в ограниченной форме лямбда омегу и Хаскелл98 поддерживает. Ну, то есть, наполовину - конструкторы типов есть (List a) :: * -> * (тип, зависящий от типа). Применили к типу Int :: *, получили (List Int) :: *. А лямбда-абстракции для этого дела нету: (\ (a :: *) -> (a -> a)) :: (* -> *) не запишешь. То есть типовый комбинатор D, такой что D Int возвращает Int -> Int D Bool возвращает Bool -> Bool etc
Кстати на data families это можно как-то задать? Я пишу:
data family D :: * -> *
type Arr a b = (->) a b
data instance D b = Arr b b
Теперь в GHCi
*TypeFam> let f1 = (\x -> x) :: Arr Int Int
*TypeFam> :t f1
f1 :: Int -> Int
*TypeFam> let f2 = (\x -> x) :: D Int
:1:10:
The lambda expression `\ x -> x' has one argument,
but its type `D Int' has none
In the expression: (\ x -> x) :: D Int
In the definition of `f2': f2 = (\ x -> x) :: D Int
no subject
Date: 2009-02-27 11:18 am (UTC)D Int возвращает Int -> Int
D Bool возвращает Bool -> Bool
etc
Кстати на data families это можно как-то задать? Я пишу:
Теперь в GHCi