2017-07-01 18 views

Odpowiedz

2

To jest DataKinds w działania, które:

  • wyciągi wartości na poziomie typu, a
  • wymienia rodzaje do rodzaju poziom

To jednak powoduje zamieszanie na poziomie typu. Teraz, w rodzaju, [X] może być albo [X] :: * lista-of X typ, albo zamiast tego możemy mieć [X] :: [T] powodu zniesienia - to (lista zawiera tylko jedną wartość X) Wartość [X] z X typu T, podniesiony na poziomie typu.

Aby przezwyciężyć tę niejednoznaczność, GHC wymaga wyceny przed konstruktorami podniesionej wartości. Mamy więc [X] :: * i '[X] :: [T].

Konkretnie w twoim przypadku Get '[JSON] [User] obejmuje zarówno wartość listy [JSON] podnoszoną do poziomu typu, jak i typ listy [User]. Aby lepiej docenić różnicę, należy pamiętać, że nie ma (użytecznych) terminów typu '[JSON], ponieważ nie jest to typ listy. Możemy mieć nawet Get '[JSON,JSON,JSON] [User] jako wyraz przyjazny, a nawet Get '[] [User]. Zamiast tego nie możemy mieć Get '[JSON] [User,User], ponieważ [User,User] nie jest typem.

(Typ Get '[JSON,JSON,JSON] [User], nawet jeśli jest ono ważne, nie można sensownie wykorzystane przez bibliotekę sługą. Nie mam pojęcia, co to podniósł lista jest używana w Sługi.)

5

Cytaty służą do rozróżniania konstruktorów na poziomie klasy od konstruktorów na poziomie terminali promowanych typów.

Na przykład:

{-# LANGUAGE DataKinds #-} 

data Which = One | Two 

myPick :: Which -- Type 
myPick = One 

type MyPick :: Which -- Kind 
type MyPick = 'One 

Nawiasem mówiąc, adnotacji rodzaj type MyPick :: Which Haskell nie jest ważna, ale to daje wyobrażenie o korespondencji pomiędzy terminem i poziomie typu. Najbliżej można dostać się do tego wymaga włączenia kolejnego rozszerzenia:

{-# LANGUAGE TypeFamilies #-} 

type family MyPick :: Which where 
    MyPick = 'One