çoğu zaman bazı değişmeyen icat ve bunun için koruma bazı yasalar yazmak için yardımcı olur. İşte
reverse xs = reverse xs ++ []
reverse (x:xs) = (reverse xs ++ [x]) ++ []
= reverse xs ++ ([x] ++ [])
= reverse xs ++ (x:[])
reverse (x:(y:xs)) =
= reverse (y:xs) ++ (x:[])
= reverse xs ++ (y:x:[])
......
reverse (x:(y:...:(z:[])...)) =
= reverse [] ++ (z:...:y:x:[])
yüzden biz hazırız
reverse xs = rev xs [] where
rev (x:xs) acc = rev xs (x:acc)
rev [] acc = acc
tanımlarsanız dikkat edin. :) yanı, bir çağrı rev a b
, a
bir kafa elemanı alıp a
boş ve sonra sadece b
var kadar b
bunu prepending bir dönüşüm altında korunur ters a
ve b
ait Ulama için. Bu da
{-# LANGUAGE TupleSections #-}
reverse = snd . until (null.fst) (\(a,b)-> (tail a,head a:b)) . (, [])
olarak, İngilizce açıklama aşağıdaki higher-order function until
kullanımı ile ifade edilebilir Ayrıca, örneğin hemen tanımlayabilir diyoruz nasıl tam olarak biraz çimdik ile aynı iç işlevini kullanarak bir revappend
fonksiyonu:
revappend xs ys = rev xs ys where
rev (x:xs) acc = rev xs (x:acc)
rev [] acc = acc
yapar '[uzunluğu xs - 1, uzunluk xs - 2..0]' çalışma? –
Yine de özyinelemeden rahat değilseniz, diğer uygulamalara bakmadan önce, aşağıdakileri doldurarak başka bir yolu tersine çevirmeyi deneyin: 'reverse [] = ...; = ... ': (xs x) ve olarak düşünmek "... boş listenin tersidir ve listeyle consed x' 'ters' xs' olduğunu ..." bu kadar – jberryman
Not olduğunu ters listelere genel olarak indeksle erişilebiliyor. Özel olarak tasarlanmıştır, böylelikle elemanlar tarafından kafa elemanlarından kolayca _recursively_, ancak rasgele pozisyonda bir eleman talep ettiğinizde çok kötü bir şekilde gerçekleştirebilirsiniz. – leftaroundabout