Yeni bir dil öğrenmeyi düşündüğüm zaman - bu durumda haskell - dil uygulamasının ve/veya kütüphanelerinin metin işlemede ne kadar iyi olduğunu görmek için ilkel bir grep klonunu bir araya getirmeye çalışıyorum, çünkü bu büyük bir kullanım durumudur. ben mi. code on the haskell wiki esinlenerekİlkel ama etkili grep klonu haskell?
, şu naif girişimi ile geldi: Bu benim bunu istediğini yapıyor gibi görünmektedir
{-# LANGUAGE FlexibleContexts, ExistentialQuantification #-}
import Text.Regex.PCRE
import System.Environment
io :: ([String] -> [String]) -> IO()
io f = interact (unlines . f . lines)
regexBool :: forall r l .
(RegexMaker Regex CompOption ExecOption r,
RegexLike Regex l) =>
r -> l -> Bool
regexBool r l = l =~ r :: Bool
grep :: forall r l .
(RegexMaker Regex CompOption ExecOption r, RegexLike Regex l) =>
r -> [l] -> [l]
grep r = filter (regexBool r)
main :: IO()
main = do
argv <- getArgs
io $ grep $ argv !! 0
, ama ne yazık ki, yavaş gerçektenvar - yaklaşık 10 kat daha yavaş Aynı şeyi yapan bir python betiği. Burada hatalı olan regex kütüphanesi olmadığını düşünüyorum, çünkü PCRE'yi çağırmak çok hızlı olmalı (Text.Regex.Posix
'a geçmek biraz daha ileride yavaşlar). Yani teorik bir bakış açısından öğretici olan ama okuduğum şeye göre yetersiz olan String
uygulaması olmalıdır.
verimli ve uygun ikisi de Haskell String
s alternatif var mı (örneğin var çok az veya hiç sürtünme yerine o String
s kullanarak geçiş) ve bu tam ve doğru olarak, hem de UTF-8 kodlanmış Unicode kolları mümkünse çok fazla güçlük çekmeden diğer kodlamalar gibi mi? Haskellede metin işlerken herkesin kullandığı, ancak henüz bilmediğim bir şey var, çünkü ben yeni başlayan biriyim?
[Metin] (https://hackage.haskell.org/package/text-1.2.2.1/docs/Data-Text.html) – ErikR
kullanın Yalnızca C-tipi hızların elde edilmesinin mümkün olduğunu belirtmek istedim, ancak biraz çaba gerektirebilir. __cgrep__ - http://awgn.github.io/cgrep/ – ErikR
'String', temel kısa dizeler için" ince "olan, ancak ciddi metin manipülasyonları için uygun olmayan düşük performanslı, tembel bir dizedir. 'Metin ', Unicode metin manipülasyonu için yüksek performanslı bir türüdür. (Ayrıca, metin için ama byte dizileri için _not_ olan ByteString' vardır.) – chi