czytałem Sługę documentation i natknąłem się na tej linii:Co oznacza znak apostrofu przed listą ("[Coś]) w Haskell?
type UserAPI = "users" :> QueryParam "sortby" SortBy :> Get '[JSON] [User]
Co jest '
robi na tej liście?
czytałem Sługę documentation i natknąłem się na tej linii:Co oznacza znak apostrofu przed listą ("[Coś]) w Haskell?
type UserAPI = "users" :> QueryParam "sortby" SortBy :> Get '[JSON] [User]
Co jest '
robi na tej liście?
To jest DataKinds
w działania, które:
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.)
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