আমার কাছে এই (স্বীকারোচিতভাবে অদ্ভুত) কোড রয়েছে যা লেন্স এবং জিএইচসি.রেকর্ডগুলি ব্যবহার করে :
{-# 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)
যে অপসারণ অস্পষ্টতা এবং এটি জরিমানা প্রনয়ন। তবে এটি কেন কাজ করে এবং কেন এটি অন্যভাবে কাজ করে না?