Зависимые типы в GHC 8. Максим Талдыкин

45
Зависимые типы в GHC 8 Максим Талдыкин [email protected]

Transcript of Зависимые типы в GHC 8. Максим Талдыкин

Page 1: Зависимые типы в GHC 8. Максим Талдыкин

Зависимые типы в GHC 8

Максим Талдыкин

[email protected]

Page 2: Зависимые типы в GHC 8. Максим Талдыкин
Page 3: Зависимые типы в GHC 8. Максим Талдыкин

Что такое?

Page 4: Зависимые типы в GHC 8. Максим Талдыкин

Just 1 : Maybe Int : * : □ Maybe : * -> * : □ Vec Int Z : * : □ Vec : * -> Nat -> * : □

Page 5: Зависимые типы в GHC 8. Максим Талдыкин

map : forall a b. (a -> b) -> [a] -> [b] map f (x:xs) = f x : map f xs map f [] = []

Page 6: Зависимые типы в GHC 8. Максим Талдыкин

map :: forall a b. (a -> b) -> [a] -> [b] map = \ (@a) (@b) (f :: a -> b) (ds :: [a]) -> case ds of [] -> GHC.Types.[] @b : x xs -> GHC.Types.: @b (f x) (map @a @b f xs)

Page 7: Зависимые типы в GHC 8. Максим Талдыкин

forall (a :: *) (b :: *) (f :: a -> b) (xs :: [a]) . [b]

Page 8: Зависимые типы в GHC 8. Максим Талдыкин

replicate :: pi (n : Nat) -> a -> Vec a n replicate Z _ = Nil replicate (S m) x = x :> replicate m a

Page 9: Зависимые типы в GHC 8. Максим Талдыкин

vis dep relforall (a : *). a - + -

a -> a + - +Monad m => m a - - +pi (a : Bool). f a - + +

pi (a : Bool) -> f a + + +

Page 10: Зависимые типы в GHC 8. Максим Талдыкин

* : *

pi

Page 11: Зависимые типы в GHC 8. Максим Талдыкин

Зачем?

Page 12: Зависимые типы в GHC 8. Максим Талдыкин

zipWithN, mapT

tail []

Page 13: Зависимые типы в GHC 8. Максим Талдыкин

strncpy :: forall (p q :: Nat) => (LE n p ~ True, LE n q ~ True) . pi (n :: Nat) -> Ptr Char p -> Ptr Char q -> IO ()

Page 14: Зависимые типы в GHC 8. Максим Талдыкин

Π-Ware: Hardware DescriptionSwierstra et al., 2015

Correct-by-Construction ConcurrencyBrady & Hammond, 2009

Security-Typed ProgrammingMorgenstern & Licata, 2010

Page 15: Зависимые типы в GHC 8. Максим Талдыкин

Type Families

Page 16: Зависимые типы в GHC 8. Максим Талдыкин

data Nat = Z | S Nat type family (m :: Nat) :+ (n :: Nat) :: Nat where Z :+ n = n (S k) :+ n = S (k :+ n) -- Vec a m -> Vec a n -> Vec a (m :+ n)

Page 17: Зависимые типы в GHC 8. Максим Талдыкин

GADTsGeneralized Algebraic Data Types

Page 18: Зависимые типы в GHC 8. Максим Талдыкин

data Vec :: Nat -> * -> * Nil :: Vec Z a (:>) :: a -> Vec n a -> Vec (S n) a

Page 19: Зависимые типы в GHC 8. Максим Талдыкин

data Vec (n :: Nat) (a :: *) :: * where Nil :: n ~ Z => Nil n a (:>) :: forall (m :: Nat) . n ~ S m => a -> Vec m a -> Vec n a

Page 20: Зависимые типы в GHC 8. Максим Талдыкин

tail :: Vec (S k) a -> Vec k a tail (_ :> xs) = xs -- (m :: Nat) (S k ~ S m)

Page 21: Зависимые типы в GHC 8. Максим Талдыкин

type family (v :: Vec a m) :++ (w :: Vec a n) :: Vec a k where Nil :++ w = w (x :> xs) :++ w = x :> (xs :++ w)

Page 22: Зависимые типы в GHC 8. Максим Талдыкин

type family (v :: Vec a m) :++ (w :: Vec a n) :: Vec a k where Nil :++ w = w (x :> xs) :++ w = x :> (xs :++ w)

‘Vec’ of kind ‘* -> Nat -> *’ is not promotable In the kind ‘Vec a m’

Page 23: Зависимые типы в GHC 8. Максим Талдыкин

Vec :: □ -> □ -> □

Page 24: Зависимые типы в GHC 8. Максим Талдыкин

replicate :: pi (n :: Nat) -> a -> Vec a n replicate Z a = Nil replicate (S m) a = a :> replicate m a

Page 25: Зависимые типы в GHC 8. Максим Талдыкин

data Nat = Z | S Nat data Nat's :: Nat -> * where Z's :: Nat's Z S's :: Nat's n -> Nat's (S n) -- S's Z's :: Nat's (S Z)

Page 26: Зависимые типы в GHC 8. Максим Талдыкин

replicate :: Nat's n -> a -> Vec a n replicate Z's a = Nil replicate (S's m) a = a :> replicate m a

Page 27: Зависимые типы в GHC 8. Максим Талдыкин

Они уже здесь!

Page 28: Зависимые типы в GHC 8. Максим Талдыкин

Singleton types here

Singleton types there

Singleton types everywhere

Monnier & Haguenauer, 2009

Page 29: Зависимые типы в GHC 8. Максим Талдыкин

Hasochism

Lindley & mcBride, 2013

Page 30: Зависимые типы в GHC 8. Максим Талдыкин

data Fin :: Nat -> * where FZ :: Fin (S n) FS :: Fin n -> Fin (S n)

Page 31: Зависимые типы в GHC 8. Максим Талдыкин

lookup :: pi (f :: Fin n) -> Vec a n -> a lookup FZ (x :> _) = x lookup (FS i) (_ :> xs) = lookup i xs

Page 32: Зависимые типы в GHC 8. Максим Талдыкин

data Fin's (n :: Nat) (f :: Fin n) :: * where FZ's :: Fin's (S m) FZ FS's :: Fin's m g -> Fin's (S m) (FS g) -- FS's FZ's :: Fin's 4 (FS FZ :: Fin 4)

Page 33: Зависимые типы в GHC 8. Максим Талдыкин

data Fin's (n :: Nat) (f :: Fin n) :: * where FZ's :: Fin's (S m) FZ FS's :: Fin's m g -> Fin's (S m) (FS g)

Kind variable also used as type variable: ‘n’ In the data type declaration for ‘Fin's’

Page 34: Зависимые типы в GHC 8. Максим Талдыкин

get "/Contract/:id" $ do intParam "id" >>= queryDb "Contract" >>= json type API = "Contract" :> Capture "id" Int :> Get '[JSON] Contract

Page 35: Зависимые типы в GHC 8. Максим Талдыкин

type Api = "Contract" :> Capture "id" Int :> RoleFilter "Contract" "owner" '[43, 265] :> Get '[JSON] (Obj Contract)

Page 36: Зависимые типы в GHC 8. Максим Талдыкин

data User (fieldName :: Symbol) where Id :: Int -> User "id" Name :: Text -> User "name" Roles :: [Vector (Ref Role)] -> User "roles" data Contract (fieldName :: Symbol) where Id :: Int -> Contract "id" Owner :: Ref Role -> Contract "owner" type family TableName (m :: Symbol -> *) :: Symbol type instance TableName User = "User" type instance TableName Contract = "Contract"

Page 37: Зависимые типы в GHC 8. Максим Талдыкин

type Api = "Contract" :> Capture "id" Int :> RoleFilter "Contract" "owner" '[43, 265] :> Get '[JSON] (Obj Contract) type Api = MkFilter Contract (RoleFilter C.Owner '[Role1, Role2])

Page 38: Зависимые типы в GHC 8. Максим Талдыкин

type family MkFilter (f :: Symbol) (m :: Symbol -> *) (filter :: *) where MkFilter f m (RoleFilter (own :: m g) rs) = TableName m :> Capture (FieldName (TableId m)) (FieldType (TableId m)) :> RoleFilter' (TableName m) g rs :> Get '[JSON] (Obj m)

Page 39: Зависимые типы в GHC 8. Максим Талдыкин

Termination

Equality

Consistency

Page 40: Зависимые типы в GHC 8. Максим Талдыкин

System FC with Explicit Kind Equality, 2013

Dependent Types in Haskell, draft

Type Inference, Haskell and Dependent Types, 2013

Page 41: Зависимые типы в GHC 8. Максим Талдыкин

Stephanie Weirich

Page 42: Зависимые типы в GHC 8. Максим Талдыкин

Richard A. Eisenberg

Page 43: Зависимые типы в GHC 8. Максим Талдыкин

Per Martin-Löf, Intuitionistic type theory (1984)

Page 44: Зависимые типы в GHC 8. Максим Талдыкин

F O R M L   M T H O D SA

E

Page 45: Зависимые типы в GHC 8. Максим Талдыкин