2014-09-16 8 views
9

मुझे प्रकार के परिवारों के साथ डेटा प्रकारों का उपयोग करते समय एक दिलचस्प स्थिति मिली।हास्केल प्रकार के परिवार के अनुप्रयोगों का मूल्यांकन नहीं किया जाता है

कंपाइलर का त्रुटि संदेश No instance for (C (ID())) arising from a use of W है। यह सुझाव देता है कि एक प्रकार का पारिवारिक आवेदन पूरी तरह से मूल्यांकन नहीं किया जाता है, भले ही यह संतृप्त हो। :kind! ID()() का मूल्यांकन करता है, इसलिए C() उदाहरण के अनुसार उपयोग किया जाना चाहिए।

{-# LANGUAGE GADTs, TypeFamilies, UndecidableInstances, FlexibleContexts #-} 

type family ID t where 
    ID t = t 

class C t where 
instance C() where 

data W where 
    W :: C (AppID t) => P t -> W 

type family AppID t where 
    AppID t = (ConstID t)() 

type family ConstID t where 
    ConstID t = ID 

data P t where 
    P :: P t 

data A 

w :: W 
w = W (P :: P A) 

क्या मैं किसी भी तरह ID() के मूल्यांकन को मजबूर कर सकता हूं? क्या यह एक कंपाइलर बग है?

मैं GHC 7.8.3

+0

(आईडी()) कुछ भी कैसे मूल्यांकन करता है? आईडी परिवार के लिए कोई उदाहरण नहीं हैं। – augustss

+0

मैंने इसे एक बंद प्रकार के परिवार के रूप में लिखा (http://www.haskell.org/haskellwiki/GHC/Type_families#Closed_family_simplification) –

+0

इसे सामान्य प्रकार के परिवार के रूप में लिखना त्रुटि को नहीं बदलता है। –

उत्तर

2

समस्या का उपयोग कर रहा ConstID की तरह है।

type family ConstID t a where 
    ConstID t a = ID a 
संबंधित मुद्दे