2013-07-07 19 views
21

Haskell 2010, String hazır bilgilerini derleme zamanında birleştirmeyi garanti ediyor mu?Haskell, String hazır bilgilerini derleme zamanında birleştiriyor mu?

Ben

"This is a " ++ 
"very long String that " ++ 
"spans several lines" 

varsa yapar

"This is a very long String that spans several lines" 
Ben mümkünse az 80 karakter uzunluğunda benim kaynak hatları tutmak istiyorum

ama tanıtmak istemiyorum derleyici tedavi bunu çalışma zamanı verimsizliği.

cevap

16

kullanın boşluk bir ters eğik arasında bir ya da daha fazla boşluk karakter dizisi

"\123\&45" == "{45" 
"\12345" == "〹" 
19

Haskell 2010, birleştirilmiş dizgeye anlamıyla eşdeğer olduğunu garanti eder, ancak nasıl derlenmesi gerektiği hakkında söyleyecek hiçbir şeyi yoktur. Yine de, ghc-core aracıyla kontrol etmek için yeterince kolay.

-- Test.hs 
main = putStrLn $ "Hello " ++ "world" 

ve biz ghc-core Test.hs

[1 of 1] Compiling Main    (Test.hs, Test.o) 

==================== Tidy Core ==================== 
Result size of Tidy Core = {terms: 19, types: 23, coercions: 9} 

main2 :: [Char] 
[GblId, 
Unf=Unf{Src=<vanilla>, TopLvl=True, Arity=0, Value=False, 
     ConLike=False, WorkFree=False, Expandable=False, 
     Guidance=IF_ARGS [] 60 0}] 
main2 = unpackCString# "Hello world" 

... 

çalıştırmak ve dize Çekirdek ara dilde birleştirildi olduğunu görünce.


Düzenleme: bu özel program, derleyici bütün dizeleri için yapacağım garanti etmez birleştirilmiş dize ile bir çekirdek dökümü var diye, diğer cevaplar ile benim anlaşmayı vurgulanması. Haskell spec ile uyumlu olmak, işlerin nasıl derlendiği hakkında çok fazla bir şey ima etmez.

+0

Dikkat:

"This is a \ \very long String that \ \spans several lines" 

sıfır genişlikli eşdeğer, basamak karakterleri sayısal kaçar ayrılması için yararlı olan \& olan ara çekirdek kodu yazdırmak için "çekirdek dökümü" kullanma hakkında :-) – David

+0

Çekirdeğe bakmak ve işlerin nasıl yürüdüğünü öğrenmek için ne kadar kolay bir yapay duyu taşıyabilirdim ... ama! Sık sık bu kadar zor olmamıştı. İlk başta sadece korkutucu. –

19

Haskell 2010, dize hazır bilgilerini derleme zamanında birleştirmeyi garanti ediyor mu?

sayılı

Çalışma zamanı verimliliği uzakta Haskell2010 kapsamından olduğunu. Deneysel uygulamaları sadece yavaş oldukları için yasaklamak istemiyoruz.

Ayrıca, derleme zamanı sırasında yapılması gerekenler, Hugs gibi çevirmenler için sorunlara neden olabilir. Son olarak, uygulayıcılara özgürlük vermek yararlıdır. Belki bazı garip şartlar altında, dizgeyi önceden hesaplamamak aslında daha hızlı olur mu?

Haskell 2010, yalnızca hata bağlamında derleme zamanı hakkında konuşuyor. (Örn. Tür hataların derlenme zamanı olduğu garanti edilir.)

4

Bunu garanti etmiyorum. Bu optimizasyonu gerçekleştiren ghc gibi derleyiciler gelebilir ancak standart olarak korunmuyor. Dolayısıyla, gelecekteki bir sürümde bu optimizasyonun oluşmayabileceği olabilir.

Neden derleme zamanında yapıldığını garanti etmek istiyorsanız, Şablon Haskell'i kullanmıyorsunuz.Aşağıdaki örnek ghc üzerinde test edilir ama çok diğer derleyiciler üzerinde çalışmak yapabilirsiniz düşünüyorum: Eğer gerçekten gerektirir dosyasında O zaman bu

module Concat where 
import Language.Haskell.TH 

(<++>) :: String -> String -> ExpQ 
(<++>) x y = stringE (x ++ y) 

gibi bir kod olabilir

bir modül dosyasında birleştirilmiş dize derleme sırasında oluşturulan -ddump-splices kullanarak derleme zamanı birleştirme

{-# LANGUAGE TemplateHaskell #-} 
import Concat 

f = $("This is a very long string" <++> 
     "which spans over several lines") 

hatta ghc kontrol edebilirsiniz yapmak.

+5

Ayrıca satır içi işleçler yerine ekleri kullanan [Zayıf bir çok belge var] (http://www.haskell.org/haskellwiki/Poor_man's_here_document) var. –

+0

@tel Teşekkürler. Bu kullanmak daha iyi görünüyor. – Satvik

İlgili konular