LINUX.ORG.RU

[haskell] можно ли поднять аргумент типа?

 


0

0

Есть классы Foo и Fie, определённые для * -> * . Есть однопараметрические типы Bar и Baz, причём Bar принадлежит классу Foo. Можно ли инстанцировать от Fie класс Baz с подставленным в него Bar a, но уже как параметрический тип от типовой переменной a.

То есть нужно что-то вроде (\a -> Baz Bar a). Это возможно?

Ну разве что во newtype завернуть

Ты ведь хочешь превратить тип с kind
Baz (Bar a) :: * -> (* -> *)

в тип с kind (* -> *). По моему дешёво этого не сделать

Shimuuar
()

Можно применить type families:

{-# LANGUAGE TypeFamilies, EmptyDataDecls #-}

data Bar a
data Baz a

type family Qux a :: *
type instance Qux a = Bar (Baz a)

type family Quux a :: *
type instance Quux (a b) = a (Baz b)

Здесь (понимая под (~) эквивалентность типов) Qux a ~ Bar (Baz a), Quux (Bar a) ~ Bar (Baz a).

exlevan
()

type families входит в стандарт языка, или расширение?

Baz (Bar a) - это же *. Baz и Bar это * -> *, соответственно, Bar a и Baz (Bar a) *. Сейчас проблема не актуально, т.к. по другому параметризовал типы.

Mihai-gr
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.