2010-12-10 29 views
5

I arızi komut dosyaları ve bu tür bilgileri için kullanarak günlük hayata Haskell tanıtmak için çalışıyorum.Regex & Dizi Kütüphaneler Haskell

readProcess dış komutların sonuçlarını almak için kullanışlıdır, ama dize sonuçlarının işlenmesi için geldiğinde kendimi aramaya bulabilirsiniz. Rejekslerin birinci sınıf olduğu rubi'den geliyorum, bu yüzden onları bir araç olarak kullanıyorum.

ben Haskell dize işleme yapmak kadar okumalısınız Herhangi kütüphaneler? Eşleşen satırları aramak, bir dizgenin eşleşen bölgelerini çekmek ve benzerleri? Normal ifadeler için

+1

haskell wiki hakkında harika bir anket bulabilirsiniz: http://www.haskell.org/haskellwiki/Regular_expressions –

cevap

4

Bunun iyi bir başlangıç ​​noktası olduğunu buldum: http://www.serpentine.com/blog/2007/02/27/a-haskell-regular-expression-tutorial/ Sadece temel konuları kapsamaz, hiçbir gelişmiş konu yoktur, ancak IMHO'yu başlatın.

Unutulmaması gereken nokta: Haskell

  • Regexes onlar dönüş türlerini aşırı olması farklıdır. Bu, bir regex eşleşmesinden çok farklı türde şeyleri çekebileceğiniz anlamına gelir. (Bool, String, [String], vs ...) Kullandığınız getiri türüne bağlı olarak, size farklı bir cevap verir (regex'in eşleşip eşleşmediği, eşleşme testi, eşleşen tüm alt gruplar, vb ..) Bu oldukça karmaşık bir typeclass voodoo kullanılarak yapılır. Yukarıdaki bağlantı temel türlerini gösterir, daha eksiksiz bir liste here
  • Gerçekte, haskell'de regex desteği sağlayan çok sayıda standart modül vardır (garip ama gerçek).Yukarıdaki öğretici, POSIX modülünü gösterir, çünkü haskell'de standart olarak gelir. Kabalık varsa, diğer regex modüllerini de kolayca yükleyebilir ve bunları kullanabilirsiniz. Bir PCre bağlama (regex-pcre) yanı sıra DFA'lar (regex-dfa, diğerleri arasında çalışan bazı paketler) var. cabal install regex-pcre gibi bir komut kullanarak yükleyin ve gitmek için iyi olmalısınız.
    • Orada
  • Haskell regex nesne IS (modüller standartlaştırılmış bir arayüz var, fark uygulanması ve düzenli ifade lezzet ağırlıklı olduğu), ama gerçekten kullanmaya ihtiyacınız yok = ~ veya = ~~ işleçleri eşleştir. (Sadece bir dize kullanın, dönüşüm otomatik olarak gerçekleşir). Göreviniz, birinci sınıf ayrıştırma nesnesini istediğiniz kadar karmaşıksa, diğer yanıtlarda da belirtildiği gibi Parsec'e bakmayı düşünün.

YASAL UYARI: Ben sadece gerçekten kullanıcı pcre'im, bu yüzden diğer paketler hakkında pek bir şey bilmiyorum.

3

iyi bir tanıtım Realworld Haskell

Update bulunan olmaktır: Bir yan not, komut işleme ve boru ve böyle, kasada HSH için.

0

Haskell büyük regex kütüphanelerini bol, ama biz iyi araçlara sahip. Şimdilik standart Haskell Dizeleri ile sadık kalacağız (yani Char'ın listeleri). Temelleri hepsi Data.List - http://www.haskell.org/ghc/docs/latest/html/libraries/base-4.3.0.0/Data-List.html. Çizgileriniz, satırlarınız, kelimeleriniz, unwords'leriniz, taksitleriniz, dropwile'larınız vb. Var. Ayrıca isPrefixOf ve isInfixOf, vb.

Kendi özyinelemeli fonksiyonlarınızı doğrudan doğruya yazabilirsiniz, ama bu da bir esinti. http://hackage.haskell.org/package/split

Temelde, kavram size karakterlerin akışlarının artan işlem yapmak istiyorum olmasıdır: Sadece gerçekten eksik işlemleri Eğer brent mükemmel paketini kullanabilirsiniz kendisi için bölme olanlar vardır.

Her şey dize temsili o kadar verimli değildir, özellikle de mümkün olduğunca etkili. Ancak, diğer veri türlerine geçtiğinizde, işleyiş şeklinizle ilgili temel kavramlar doğrudan temel dizelerden çevrilir.

+0

Bir dizenin 'tails'lerinde' isPrefixOf 'kullanılması _better_ olsa da, daha da kötüdür. Yazmak için daha çok bir PITA, ve daha sonra da iyi bir dizgi eşleştiricisi. – rampion

+0

Dediğim gibi "her şey mümkün olduğunca verimli değil". 'isInfixOf' gerçekten atıfta bulunduğum şey. Ancak yazması neredeyse hiç "bir PITA" değil. Ve dediğim gibi, çekirdek kavram basit bir şekilde çevriliyor. – sclv

+1

@rampion: "İyi bir dizgi eşleştiricisi" ile ilgilendiğiniz noktadaysanız, "[Char]" özelliğini kullanmamanız gerektiğini de eklemeliyim. Data.Text'in iyi bir eşleyicisi var. kutunun dışında ve bytestrings için de mükemmel bir substring arama paketi var. – sclv

3

ilk ben ben dize işleme için bir ayrıştırıcı combinator kütüphanesini kullanmayı öğrenme fantastik bir yatırım olduğu bulundu Haskell öğretiyordu. Onlar düzenli ifadeler yapabileceği her şeyi ve çok daha fazlası, ve yazma combinator ayrıştırıcılar yapabilirsiniz Bugünlerde Attoparsec kullanma eğiliminde büyük bir monads, uygulamalı functors gibi tip sınıfları hakkında sezgileri birikmesine yol vb

olmakla Parsec muhtemelen daha iyi bir başlangıç ​​noktasıdır çünkü daha geniş bir şekilde belgelendirilmiş ve tartışılmıştır, daha iyi hata mesajları sağlar.

+0

Henüz "Parsec" bölümüne ulaşmadım, yine de dört gözle bekliyorum. :) –

+0

iyi bir fikir gibi geliyor. – rampion