हास्केल डीबी के बारे में हालिया पोस्ट के साथ, मुझे फिर से एचएलिस्ट को देखने के लिए प्रेरित किया गया है। चूंकि अब हमारे पास जीएचसी में -XDataKinds
है, जिसमें वास्तव में विषम सूचियों का एक उदाहरण है, मैं जांच करना चाहता हूं कि एचएलिस्ट्स डेटाकिंड्स के साथ कैसे दिखते हैं।क्या इस डेटाकिंड्स-समर्थित विषम सूची कार्यान्वयन के लिए ओवरलैपिंग इंस्टेंस को निकालना संभव है?
{-# 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 प्रश्न हैं। सबसे पहले, क्या टाइप प्रकार के बिना (=?)
(रिकॉर्ड फ़ील्ड एक्सेसर फ़ंक्शन) लिखना संभव है? यदि नहीं, तो क्या इसे ओवरलैपिंग उदाहरणों के बिना लिखा जा सकता है?
मुझे कल्पना है कि मेरे पहले प्रश्न के लिए यह संभव नहीं है, लेकिन शायद दूसरा संभव हो सकता है। मुझे यह जानना अच्छा लगेगा कि लोग क्या सोचते हैं!
चूंकि मूल एचएलआईस्ट पेपर केवल 'मल्टीपाराम टाइप क्लासेस' और 'फंक्शनल डायरेक्टेंसीज' का उपयोग करने में कामयाब रहा, इसलिए मुझे लगता है कि 'डेटाकिंड्स) में केवल (और उपयोग) 'वह नहीं बदलेगा। –
@ Ptharien'sFlame एचएलआईस्ट पेपर टाइपएक लागू करने के लिए ओवरलैपिंग इंस्टेंस का उपयोग करता है। TypeEq –
@ फिलिपजेएफ का उपयोग करके बाकी सब कुछ किया जा सकता है, फिर आपको केवल 'TypeFamilies' और 'MultiParamTypeClasses' की आवश्यकता है, कोई 'TypeEq' आवश्यक नहीं है! –