আমি সিনট্যাক্টিকের কোনও প্রকাশিত সংস্করণ দেখতে পাচ্ছি না যার স্বাক্ষরগুলি sugarSym
সেই সঠিক টাইপের নাম ব্যবহার করে , তাই আমি প্রতিশ্রুতি 8cfd02 at এর বিকাশ শাখাটি ব্যবহার করব , এটি সর্বশেষ সংস্করণ যা এখনও এই নামগুলি ব্যবহার করে।
সুতরাং, জিএইচসি fi
আপনার ধরণের স্বাক্ষরটি সম্পর্কে অভিযোগ করে তবে এটির জন্য কেন নয় sugarSym
? আপনি যে ডকুমেন্টেশনের সাথে লিঙ্ক করেছেন সেটি ব্যাখ্যা করে যে কোনও প্রকার দ্বিধাটির ডানদিকে উপস্থিত না হলে অস্পষ্ট, যদি না সীমাবদ্ধতা অন্যান্য অ-দ্বিধাগ্রস্ত প্রকারের থেকে অন্যথায়-দ্ব্যর্থক প্রকারটি নির্ধারণ করতে কার্যকরী নির্ভরতা ব্যবহার করে না। সুতরাং আসুন দুটি ফাংশনের প্রসঙ্গটি তুলনা করি এবং কার্যকরী নির্ভরতাগুলি সন্ধান করি।
class ApplySym sig f sym | sig sym -> f, f -> sig sym
class SyntacticN f internal | f -> internal
sugarSym :: ( sub :<: AST sup
, ApplySym sig fi sup
, SyntacticN f fi
)
=> sub sig -> f
share :: ( Let :<: sup
, sup ~ Domain b
, sup ~ Domain a
, Syntactic a
, Syntactic b
, Syntactic (a -> b)
, SyntacticN (a -> (a -> b) -> b) fi
)
=> a -> (a -> b) -> b
সুতরাং জন্য sugarSym
, অ-দ্ব্যর্থক ধরনের হয় sub
, sig
এবং f
, এবং যারা থেকে আমরা অর্ডার সব অন্যান্য, প্রেক্ষাপটে ব্যবহৃত যথা ধরনের দুর্বোধ্য করার জন্য কার্মিক নির্ভরতা অনুসরণ করতে সক্ষম হওয়া উচিত sup
এবং fi
। এবং প্রকৃতপক্ষে, f -> internal
কার্যকরী নির্ভরতা SyntacticN
আমাদের আমাদের f
নিরস্ত করতে ব্যবহার করে fi
এবং এরপরে f -> sig sym
কার্যকরী নির্ভরতা ApplySym
আমাদের সদ্য-বিভ্রান্তিকরকে নিরস্ত fi
করতে ব্যবহার করে sup
(এবং sig
যা ইতিমধ্যে দ্ব্যর্থহীন ছিল)। সুতরাং যে ব্যাখ্যা দিয়েছে কেন sugarSym
প্রয়োজন হয় না AllowAmbiguousTypes
এক্সটেনশান।
আসুন এখন তাকান sugar
। প্রথম যে বিষয়টি আমি লক্ষ্য করছি তা হল যে সংকলকটি একটি অস্পষ্ট ধরণের সম্পর্কে অভিযোগ করছে না , বরং ওভারল্যাপিংয়ের উদাহরণগুলি সম্পর্কে:
Overlapping instances for SyntacticN b fi
arising from the ambiguity check for ‘share’
Matching givens (or their superclasses):
(SyntacticN (a -> (a -> b) -> b) fi1)
Matching instances:
instance [overlap ok] (Syntactic f, Domain f ~ sym,
fi ~ AST sym (Full (Internal f))) =>
SyntacticN f fi
-- Defined in ‘Data.Syntactic.Sugar’
instance [overlap ok] (Syntactic a, Domain a ~ sym,
ia ~ Internal a, SyntacticN f fi) =>
SyntacticN (a -> f) (AST sym (Full ia) -> fi)
-- Defined in ‘Data.Syntactic.Sugar’
(The choice depends on the instantiation of ‘b, fi’)
To defer the ambiguity check to use sites, enable AllowAmbiguousTypes
সুতরাং আমি যদি এই অধিকারটি পড়ছি তবে এটি এমন নয় যে জিএইচসি আপনার প্রকারগুলি দ্বিধাগ্রস্থ বলে মনে করে, বরং এটি আপনার ধরণের দ্বিধাহীন কিনা তা যাচাই করার সময়, জিএইচসি একটি পৃথক, পৃথক সমস্যার মুখোমুখি হয়েছিল। এটি তখন আপনাকে বলছে যে আপনি যদি GHC কে অস্পষ্টতা পরীক্ষা না করতে বলে থাকেন, তবে এটি পৃথক সমস্যাটির মুখোমুখি হত না। এটি ব্যাখ্যা করে যে অ্যাম্বিগিউস টাইপগুলি মঞ্জুরি দেওয়ার কারণে আপনার কোডটি সংকলনের অনুমতি দেয়।
তবে ওভারল্যাপিং দৃষ্টান্তগুলির সাথে সমস্যাটি রয়ে গেছে। জিএইচসি দ্বারা তালিকাভুক্ত দুটি উদাহরণ ( SyntacticN f fi
এবং SyntacticN (a -> f) ...
) একে অপরের সাথে ওভারল্যাপ করে। আশ্চর্যজনকভাবে যথেষ্ট, এটির মধ্যে প্রথমটি অন্য কোনও উদাহরণের সাথে ওভারল্যাপ হওয়া উচিত বলে মনে হচ্ছে এটি সন্দেহজনক। এবং [overlap ok]
মানে কি?
আমি সন্দেহ করি যে সিন্ট্যাকটিক ওভারল্যাপিংআইজনেসগুলি সংকলিত। এবং কোড খুঁজছেন , প্রকৃতপক্ষে এটি।
কিছুটা পরীক্ষা-নিরীক্ষা করে মনে হয় যে, একজনের তুলনায় অন্যটির চেয়ে কঠোরভাবে জেনারেল স্পষ্ট হয়ে উঠেছে যে জিএইচসি ওভারল্যাপিংয়ের উদাহরণগুলির সাথে ঠিক আছে:
{-# LANGUAGE FlexibleInstances, OverlappingInstances #-}
class Foo a where
whichOne :: a -> String
instance Foo a where
whichOne _ = "a"
instance Foo [a] where
whichOne _ = "[a]"
-- |
-- >>> main
-- [a]
main :: IO ()
main = putStrLn $ whichOne (undefined :: [Int])
অন্য কোনওটির তুলনায় স্পষ্টতই কোনও ভাল ফিট না হলে ওভারল্যাপিংয়ের উদাহরণগুলির সাথে জিএইচসি ঠিক নেই:
{-# LANGUAGE FlexibleInstances, OverlappingInstances #-}
class Foo a where
whichOne :: a -> String
instance Foo (f Int) where -- this is the line which changed
whichOne _ = "f Int"
instance Foo [a] where
whichOne _ = "[a]"
-- |
-- >>> main
-- Error: Overlapping instances for Foo [Int]
main :: IO ()
main = putStrLn $ whichOne (undefined :: [Int])
আপনার ধরণের স্বাক্ষর ব্যবহার করে SyntacticN (a -> (a -> b) -> b) fi
এবং অন্যগুলির চেয়ে ভালও নয় SyntacticN f fi
nor SyntacticN (a -> f) (AST sym (Full ia) -> fi)
আমি যদি আপনার ধরণের স্বাক্ষরের সেই অংশটি SyntacticN a fi
বা SyntacticN (a -> (a -> b) -> b) (AST sym (Full ia) -> fi)
এটিতে পরিবর্তন করি তবে জিএইচসি আর ওভারল্যাপ সম্পর্কে আর অভিযোগ করে না।
আমি যদি আপনি হয়ে থাকি তবে আমি সেই দুটি সম্ভাব্য দৃষ্টান্তের সংজ্ঞাটি দেখব এবং নির্ধারণ করবো যে এই দুটি বাস্তবায়নগুলির মধ্যে একটি আপনার পছন্দসই কিনা।
sugarSym Let
, যা(SyntacticN f (ASTF sup a -> ASTF sup (a -> b) -> ASTF sup b), Let :<: sup) => f
এবং দ্ব্যর্থক টাইপ ভেরিয়েবল সঙ্গে যুক্ত নয়?