मेरे पास यह (अजीब तरह से) कोड है जो लेंस और GHC.Records का उपयोग करता है :
{-# LANGUAGE DataKinds, PolyKinds, FlexibleInstances, UndecidableInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
module Main where
import Control.Lens
import GHC.Records
data Glass r = Glass -- just a dumb proxy
class Glassy r where
the :: Glass r
instance Glassy x where
the = Glass
instance (HasField k r v, x ~ r)
-- instance (HasField k r v, Glass x ~ Glass r)
=> HasField k (Glass x) (ReifiedGetter r v) where
getField _ = Getter (to (getField @k))
data Person = Person { name :: String, age :: Int }
main :: IO ()
main = do
putStrLn $ Person "foo" 0 ^. runGetter (getField @"name" the)
विचार एक HasField
उदाहरण है कि ReifiedGetter
एक प्रॉक्सी से बाहर है, बस यह नरक के लिए है। लेकिन यह काम नहीं कर रहा है:
* Ambiguous type variable `r0' arising from a use of `getField'
prevents the constraint `(HasField
"name"
(Glass r0)
(ReifiedGetter Person [Char]))' from being solved.
मुझे समझ नहीं आता कि r0
अस्पष्ट क्यों रहता है। मैंने बाधा चाल का उपयोग किया , और मेरा अंतर्ज्ञान यह है कि उदाहरण के सिर का मिलान होना चाहिए, फिर टाइपराइटर r0 ~ Person
पूर्व शर्त में मिल जाएगा , और इससे अस्पष्टता दूर होगी।
अगर मैं इसमें बदल (HasField k r v, x ~ r)
जाता हूं (HasField k r v, Glass x ~ Glass r)
तो अस्पष्टता दूर हो जाती है और यह ठीक संकलन करता है। लेकिन यह काम क्यों करता है, और यह दूसरे तरीके से काम क्यों नहीं करता है?