SORU
15 Mayıs 2014, PERŞEMBE


-XAllowAmbiguousTypes uygun mu?

Son zamanlarda syntactic-2.0 question share tanımı ile ilgili gönderdiniz. Bu çalışma yaptımDZD 7.6:

{-# LANGUAGE GADTs, TypeOperators, FlexibleContexts #-}

import Data.Syntactic
import Data.Syntactic.Sugar.BindingT

data Let a where
    Let :: Let (a :-> (a -> b) :-> Full b)

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
share = sugarSym Let

Ancak, DZD 7.8 -XAllowAmbiguousTypes Bu imza ile derlemek istiyor. Alternatif olarak, fi beni değiştirebilirsiniz

(ASTF sup (Internal a) -> AST sup ((Internal a) :-> Full (Internal b)) -> ASTF sup (Internal b))

tipi SyntacticN fundep tarafından açık olan. Bu beni uzantısı önlemek için izin verir. Bu tabii ki

  • çok uzun bir yazın zaten büyük bir imza eklemek için
  • yorucu elle türetmek
  • bu fundep nedeniyle gereksiz

Benim sorular şunlardır:

  1. Bu -XAllowAmbiguousTypes kabul edilebilir bir kullanım mı?
  2. Genel olarak, ne zaman bu uzantı kullanılır? Cevap here öneriyor "neredeyse hiçbir zaman iyi bir fikirdir".
  3. the docs, okudum ama hala sorun varsa bir kısıtlama belirsiz olup olmadığını karar yaşıyorum. Özellikle, Veri bu işlevi göz önünde bulundurun.Sözdizimsel.Şeker:

    sugarSym :: (sub :<: AST sup, ApplySym sig fi sup, SyntacticN f fi) 
             => sub sig -> f
    sugarSym = sugarN . appSym
    

    fi (ve muhtemelen sup) belirsiz burada olmalı, ama uzantısı derler bana görünüyor. Neden share sugarSym anlaşılır? share sugarSym heteroseksüel gel share kısıtlamalar sugarSym gelen bir uygulama.

CEVAP
23 NİSAN 2015, PERŞEMBE


Bu tam tür adları kullanan bir sözdizimsel yayınlanmış halini görmek istemiyorum, hala bu isimleri kullanılan the development branch at commit 8cfd02^ en son sürümü kullanacağım.

Neden DZD yazın, imza fi sugarSym için değil şikayet ediyor mu? Belgeleriniz bağlantılı açıklayan bir tür belirsiz vermezse görünmesini hakkının kısıtlaması, sürece sınırlamadır kullanarak işlevsel bağımlılıkları için anlaması aksi belirsiz türünden olmayan diğer belirsiz tipler. Hadi iki işlevi ve bu bağlamda karşılaştırın ve işlevsel bağımlılıkları.

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

Yani sugarSym olmayan-belirsiz tipleri sub, sig f, Bu yüzden biz olabilir izleyin fonksiyonel bağımlılıkları için belirsizliği ortadan kaldırmak için tüm diğer türleri kullanılan bağlamında, yani sup fi. Ve gerçekten de, f -> internal işlevsel bağımlılık SyntacticN kullanır bizim f belirsizliği ortadan kaldırmak bizim fi, ve bundan sonra f -> sig sym işlevsel bağımlılık ApplySym kullanır bizim yeni disambiguated fi belirsizliği sup (sig, olan oldu zaten olmayan belirsiz). sugarSym AllowAmbiguousTypes uzantısı gerektirmez açıklıyor.

Hadi şimdi sugar bak. İlk fark ettiğim şey derleyici olmasıdırdeğilhakkında belirsiz bir tür, daha ziyade, üst üste örnekleri hakkında şikayet:

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

Eğer bu doğru anlıyorsam, DZD türlerini belirsiz olduğunu, ancak bunun yerine, tür belirsiz olup olmadığını kontrol ederken, DZD farklı, ayrı bir sorunla karşılaştı, ama o değil. Daha sonra ise belirsizlik denetimi yapmak için değil DZD söyledim, o ayrı bir problem olurdu eminiz. Bu AllowAmbiguousTypes etkinleştirme kodunuzu derlemek için izin verir açıklıyor.

Ancak, üst üste gelen örnekleri ile sorun olmaya devam ediyor. İki örnekleri DZD (SyntacticN f fi SyntacticN (a -> f) ...) tarafından listelenen birbirleriyle örtüşüyor. Gariptir ki, bu ilk şüpheli olan herhangi bir diğer örneği ile örtüşüyor gibi görünüyor. [overlap ok] ne anlama geliyor?

Sözdizimsel Overlappingİnstances derlenmiş olduğunu sanıyorum. the code gerçekten de öyle bakıyor.

Biraz deneme, DZD biri kesinlikle diğerinden daha çok genel olduğu açıktır durumlar üst üste sorun gibi görünüyor:

{-# 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])

Ama DZD de açıkça diğerinden daha iyi bir uyum olduğunda örtüşen örnekler değil, Tamam

{-# 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])

Yazın imzanızı SyntacticN (a -> (a -> b) -> b) fi kullanır ve SyntacticN f fi ne SyntacticN (a -> f) (AST sym (Full ia) -> fi) hiçbiri diğerinden daha iyi bir seçimdir. Eğer değiştirirsem SyntacticN a fi SyntacticN (a -> (a -> b) -> b) (AST sym (Full ia) -> fi), DZD yazın imzanızı o kısmı artık üst üste şikayet ediyor.

Eğer senin yerinde olsaydım, the definition of those two possible instances bak ve o iki uyarlaması istediğiniz bir olup olmadığını belirlemek istiyorum.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • TokShogun

    TokShogun

    6 HAZİRAN 2009
  • TROPFEST

    TROPFEST

    27 Mart 2007
  • WPBeginner - WordPress Tutorials

    WPBeginner -

    17 Temmuz 2009