Normal dize karşılaştırması, yalnızca dizgilerin uzunluğu değil, sözlüksel sıralamayla çalışır.Daha genel
smaller :: String -> String -> Bool
smaller s1 s2 | length s1 < length s2 = True
| length s1 > length s2 = False
| otherwise = s1 < s2
Veya biraz:
compareStrings :: String -> String -> Ordering
compareStrings s1 s2 | length s1 < length s2 = LT
| length s1 > length s2 = GT
| otherwise = compare s1 s2
Örnek:
ghci> compare "ab" "z"
LT
ghci> compareStrings "ab" "z"
GT
yüzden de uzunluk için kontrol etmek için kendi işlevi yazmak zorunda kalacak
Monoids ile etrafta dolaşıyorduk
instance Ord a => Ord [a] where
compare = comparing length
`mappend` comparing head `mappend` comparing tail
oldukça bu anlamıyorum Ama eğer ben ilk tanım ;-)
Bu, benim sürümümden açıkça daha hızlıdır, çünkü yalnızca dizelerin uzunluğunu bir kez hesaplar. Giriş dizgileri üzerinde doğrudan bir desen eşleştirmesi yapılarak daha da hızlı yapılabilir, böylece bu tanım ve uzunluk fonksiyonunun tanımı birleştirilir. –
Haskell, genelleştirme ve iyi kodlama uygulamaları ile ilgilidir ve çok iyi bir tip (sınıf) sistemine sahiptir. Neden işlevi "karşılaştır" olarak yeniden yazmayın: Ord a => [a] -> [a] -> Sıralama 'veya benzeri? –
@Aleksander: OP'nin istediği şeye bağlıdır.OP oldukça basit bir soru sorduğundan, belki de temel bir cevap istiyordur? Haskell'de böyle bir işlevi yazmanın daha hızlı ve/veya daha fazla deyim taşıdığından şüphe etmiyorum, ancak OP'nin öğrenmesine yardımcı olmak için işleri basit tutmak daha iyidir. –