2016-05-18 19 views
6

Şablon haskell ekleme yazıyorum ve doğru türde Name s üretmek için mücadele ediyorum. Bilinen bir ad oluşturmak istiyorsam (örneğin, f işlevi), 'f'u kullanabilirim. Bu, nerede kullanıldığımı değil, tam olarak ne istediğimi, ekini tanımladığım kapsamda olmak için f gerektirir.Geçerli kapsamı oluştururken haskell şablonunda dinamik İsim üret

Şimdi aynı şeyi istiyorum, ancak dinamik bir ad için. Örneğin, eklediğimin bir argüman olarak n :: Int aldığını varsayalım. "f" ++ show n ürününü Name olarak oluşturmak istiyorum, kullanım yeri yerine ekleme tanımı sitesinde bakın.

Birkaç seçenek denedim: mkName ve lookupValueName her ikisinin de kullanım alanında kapsamda olmasını gerektirir. Tek tırnaklı söz dizimi, bir dinamik isim değil, basit bir isme ihtiyaç duyar.

Son olarak mkNameG ile deneme yapmaya başladım. İşlevler, kullandığım paketin aynısından geldiğinden, paket adıyla başladım, ancak bu, Can't find interface-file declaration for variable the-package-name:Some.Module.f0 hatalarını verdi. Bazı kaynak okumalardan sonra, paket adı "main"'un kullanıldığı yerler buldum. Bu GHCi'de çalışıyor gibi görünüyor, ama derlerken hala aynı hatayı alıyorum.

Bunu yapmanın bir yolu var mı? Tabii ki tüm seçenekleri sıralayabilirim, ancak bu egzersizin bütün amacı kodu daha dinamik yapmak olduğundan, bundan kaçınmak isterim.

cevap

1

Bunu, paket adını belirli bir Name'f0'dan ayıklayıp bunu mkNameG_v'a geçirerek yapabileceğinizi hayal edin. Eğer Name yılında kullanmaya kadar bir hata alıyorum mkNameG şey geçemediği ve oysa tanımlayıcı f gerçekten kapsamında olduğunu 'f çek yazma

  • : Bu iki nedenden dolayı iyi bir fikir olmayabilir bir şekilde. Gerçekte var olan tanımlayıcılar için yalnızca Name s oluşturduğunuz veya Name (yalnızca GHC'nin gördüğünüz hatayla başarısız olmasına izin vermedikçe) hatadan recover oluşturduğunuzdan emin olmanız gerekir. Ayrıca 'f'un yazılması da f'un kullanımı olarak sayılır.

  • Kullanılmayan tanımlanmamış tanımlar basitçe atılır, böylece mkNameG ile bunlara başvuramazsınız. "f" ++ show n tanımlayıcılarınızın kullanıldığından emin olmanın başka bir yolunu bulmanız gerekecektir.

+0

Teşekkürler, bu harika çalışıyor! Bahsettiğiniz iki sorun aslında benim durumumda sorun teşkil etmeyebilir, çünkü: 1) Tanımlayıcılar TH tarafından da üretildi, aynı girdilerden ve 2) Tanımlar ihraç edildi. Biraz daha düşünmeye başladığımda, iki TH parçasını birleştirebiliyor ve problemden tamamen kurtulabiliyorum. –