HaskellDB에 관한 최근 글이 있으면 HList를 다시 살펴볼 동기가 있습니다. GHC에 -XDataKinds
이 있는데 실제로 이질적인 목록의 예가 있으므로 HL 키가 DataKind로 어떻게 보이는지 조사하고 싶습니다. 이것은 예상하지만,이 프로젝트의 내 목표 시도하고 가능한 한 많은 종류의 클래스없이 그것을 할 수 있었다으로 작동이 DataKinds를 지원하는 이기종 목록 구현을 위해 OverlappingInstances를 제거 할 수 있습니까?
{-# 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
: 지금까지, 나는 다음 있습니다. 여기에는 2 가지 질문이 있습니다. 첫째, 형식 클래스없이 (=?)
(레코드 필드 접근 자 함수)을 쓸 수 있습니까? 그렇지 않다면 중복 인스턴스없이 작성할 수 있습니까?
내 첫 번째 질문에는 불가능하다고 생각하지만 두 번째 질문이 가능할 수도 있습니다. 나는 사람들이 생각하는 것을 듣고 싶다!
원래의 HList 논문은'MultiParamTypeClasses'와'FunctionalDependencies'만으로도 벗어날 수 있었기 때문에,'DataKinds '그걸 바꾸지 않을거야. –
@Ptharien'sFlame HList 종이는 TypeEq를 구현하기 위해 overlappingInstances를 사용합니다. 그 외 모든 것은 TypeEq –
@PhilipJF를 사용하여 수행 할 수 있습니다. 그러면 'TypeFamilies'와'MultiParamTypeClasses' 만 있으면됩니다.'TypeEq'은 필요하지 않습니다! –