SORU
6 Kasım 2014, PERŞEMBE


Haskell's type checker çok yanlış türde bir değişimi sağlayan ve program hala derler

Benim programda bir sorun (eşit bir yarıçap ile 2 daireler farklı boyutlarda Parlak kullanarak çiziliyor) debug etmeye çalışırken, garip bir durum çıktı karşıma. Dosyamda bu nesneleri işleme, Player için aşağıdaki tanım var:

type Coord = (Float,Float)
data Obj =  Player  { oPos :: Coord, oDims :: Coord }

Nesneleri ithal eden ve benim ana dosya.hs, aşağıdaki tanım var:

startPlayer :: Obj
startPlayer = Player (0,0) 10

Bu olay nedeniyle bana ekleme ve değiştirme alanları için oyuncu ve unutmak için güncelleme startPlayer sonra (boyutları olduğunu tespit ederek tek bir sayıyı temsil yarıçapı, ama değiştirdim bir Coord temsil (genişlik,yükseklik); diye yapacağım oyuncu nesnesi olmayan bir daire).

Şaşırtıcı şey, yukarıdaki kodu derler ve, yanlış türde ikinci bir alan olmasına rağmen çalışır.

Ben ilk belki de dosyaları açmak farklı sürümleri olduğunu düşündüm, ama herhangi bir dosya herhangi bir değişiklik derlenmiş program da yansıdı.

Belki seneye startPlayer nedense kullanılmamış olduğunu düşünmüştüm. Yorum oluşturma startPlayer verimleri bir derleyici hata olsa bile yabancı, değişen 10 startPlayer neden uygun bir yanıt (değişiklikler başlangıç boyutu Player); yine, rağmen olmanın yanlış yazın. Veri tanımı okuma, emin olmak için doğru dosyaya bir yazım hatası yerleştirdim ve bana bir hata verdi; doğru dosya bakıyorum.

2 parçacıkları yapıştırma yukarıda kendi dosyasına çalıştım ama başaramadım startPlayer 12 *ikinci alan yanlış olduğunu beklenen hata tükürdü.

Muhtemelen bu izin ne olabilir? Bu Haskell tür denetleyicisi önlemek gereken çok şey olduğunu düşünmek istiyorum.

CEVAP
6 Kasım 2014, PERŞEMBE


Bu muhtemelen derlemek için tek yol varsa Num (Float,Float) bir örnek varsa orada. Bu kullandığınız kütüphaneler biri gereksiz yere eklenen, mümkün olsa da standart kütüphane tarafından sağlanan değil. Ghci proje yükleme deneyin ve eğer 10 :: (Float,Float) çalıştığını görmek, :i Num örnek gelen ve tanımlanmış kim bağırma nerede olduğunu bulmaya çalışın.

Ek: örnekler kapatmak için bir yol Yoktur. Hatta bir yolu yokdeğilbir modülden onları ihracat. Eğer bu mümkün olsaydı, hatta ona neden olacaktırdaha fazlakafa karıştırıcı kod. Tek gerçek çözüm burada, bu gibi durumlarda değil tanımlamaktır.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • snookie77

    snookie77

    2 Mart 2006
  • TechBalance

    TechBalance

    12 HAZİRAN 2011
  • thetrollska

    thetrollska

    2 EKİM 2009