HaskellDB ile ilgili son mesajlar, tekrar HList içine bakmak için motive oldum. Halihazırda heterojen listelerin bir örneğine sahip olan GHC'de -XDataKinds
'a sahip olduğumuz için, HList'lerin DataKind'ler ile nasıl göründüğünü araştırmak istedim. Bu beklenen bir durumdur ama bu projede amacım denemek ve mümkün olduğunca fazla tip sınıfları olmadan bunu yapmak için olduğu gibi çalışırBu DataKinds destekli heterojen liste uygulaması için OverlappingInstances öğesini kaldırmak mümkün mü?
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE OverlappingInstances #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
import Data.Tagged
data Record :: [*] -> * where
RNil :: Record '[]
(:*:) :: Tagged f (FieldV f) -> Record t -> Record (f ': t)
type family FieldV a :: *
emptyRecord = RNil
(=:) :: (v ~ FieldV f) => f -> v -> Tagged f v
f =: v = Tagged v
class HasField x xs where
(=?) :: Record xs -> x -> FieldV x
instance HasField x (x ': xs) where
(Tagged v :*: _) =? _ = v
instance HasField x xs => HasField x (a ': xs) where
(_ :*: r) =? f = r =? f
--------------------------------------------------------------------------------
data EmployeeName = EmployeeName
type instance FieldV EmployeeName = String
data EmployeeID = EmployeeID
type instance FieldV EmployeeID = Int
employee = (EmployeeName =: "James")
:*: ((EmployeeID =: 5) :*: RNil)
employeeName = employee =? EmployeeName
employeeId = employee =? EmployeeID
: Şu ana kadar takip var. Yani burada 2 soru var. İlk olarak, bir tip sınıfı olmadan (=?)
(kayıt alanı erişim işlevi) yazmak mümkün mü? Değilse, çakışan örnekler olmadan yazılabilir mi?
İlk sorumun mümkün olmadığını hayal ediyorum ama belki ikinci olabilir. İnsanların ne düşündüğünü duymak isterim!
Orijinal HList kağıdı, yalnızca "MultiParamTypeClasses" ve "FunctionalDependencies" kullanarak kurtulmayı başardığından, sadece DataKinds içine ekleyerek (ve kullanarak) düşünürdüm bunu değiştirmezdi. –
@ Ptharien'sFlame the HList kağıdı TypeEq uygulamak için örtüşen kullanır kullanır. Diğer her şey TypeEq –
@PhilipJF kullanılarak yapılabilir. Ardından tek ihtiyacınız olan 'TypeFamilies' ve' MultiParamTypeClasses', 'TypeEq' gerekli değil! –