umarım daha iyi anlamaları için, çizgiler, satır satır geçiyor: hat 1'de
1| maximum' :: (Ord a) => [a] -> a
2| maximum' [] = error "maximum of empty list"
3| maximum' [x] = x
4| maximum' (x:xs)
| x > maxTail = x
| otherwise = maxTail
where maxTail = maximum' xs
: Eğer bir yılların listesini almak ve bu tür bir elementi dönmek demek. Ayrıca, bu listedeki öğelerin ya da alınabilir olması gerekir, böylece bunları bir siparişe koyabilirsiniz.
Satır 2'de: giriş olarak boş bir liste alırsanız, o boş listede "en yüksek değer" bulunamayacağını ve böylece bir hatayla işlevi sonlandıracağınızı söyleyen bir kenar durumunuz vardır. .
Satır 3'te: 1 öğe içeren bir liste alırsanız, bu öğenin en yüksek öğe olması gerektiğini söyleyen başka bir kenar durumunuz vardır, böylece döndürün.
Satır 4'te: birinci öğeye (x
) ve listenin kalanına (xs
) uyması için desen eşleştirmesi kullanın. Daha sonra 'un maxTail
'dan daha büyük olup olmadığını kontrol edin, burada maximum'
işlevinin sonucu xs
listesinin geri kalanıyla aranır. O x
maxTail
büyükse
sonra x
dönmek ve aksi maxTail
den büyük x
ve maxTail
dönmek olduğunu.
bazı sayılarla bir örnek de burada yardımcı gerektiğini düşünüyorum:
girişi:
[2, 5, 4, 13]
çağrı:
maximum' [2, 5, 4, 13]
Ne olur?
İkinci örnekte 0
maximum' (x : xs)
↓ ↓
maximum' (2:[5, 4, 13])
│
↓ result 13
x > maxTail = x ↑
2 > maximum' [5, 4, 13] = x //2 > 13 = 13 ← ────┐
│ │
└ maximum' (x : xs) │
↓ ↓ │
maximum' (5:[4, 13]) │
│ │
↓ ↑
x > maxTail = x │
5 > maximum' [4, 13] = x //5 > 13 = 13 ← ─────┐
│ │
└ maximum' (x: xs) │
↓ ↓ │
maximum' (4:[13]) │
│ │
↓ ↑
x > maxTail = x │
4 > maximum' [13] = x //4 > 13 = 13 ┐
│ │
└ maximum' [x] = x ↑
maximum' [13] = 13 → ───────────┘
Hemen hemen aynı: hat 1'de
1| reverse' :: [a] -> [a]
2| reverse' [] = []
3| reverse' (x:xs) = reverse' xs ++ [x]
: Eğer bir yıllardan bir listesini almak ve bir yılların listesini döndürür söylerler.
Satır 2'de: Boş bir liste alırsanız, tersi listenin de boş olduğu bir kenar durumunuz vardır.
Satır 3'te: listenin ilk elemanına (x
) ve kuyruğun (xs
) eşleşmesi için tekrar desen eşleştirmesi kullanın.
Artık iki listeyi birlikte eklemek için ++
kullanın, bu da ters kuyruklu listenin ilk öğesidir.
Ve yine ben biraz daha anlaşılır olacak bir örnekle umut:
girişi:
[1, 2, 3]
çağrı: ne olur
reverse' [1, 2, 3]
:
reverse' (x : xs)
↓ ↓
reverse' (1:[2, 3])
│ result [3, 2, 1]
↓ ↑
(reverse' [2, 3]) ++ [1] //[3, 2] ++ [1] = [3, 2, 1] ← ────┐
│ │
└ reverse' (x: xs) │
↓ ↓ │
reverse' (2:[3]) │
│ ↑
↓ │
(reverse' [3]) ++ [2] //[3] ++ [2] = [3, 2] ← ───┐ → ┘
│ │
└ reverse' (x:xs) │
↓ ↓ │
reverse' (3:[]) │
│ ↑
↓ │
(reverse' []) ++ [3] //[] ++ [3] = [3] ┐ → ┘
│ ↑
└ reverse' [] = [] → ──────────────────┘
'reverse'' demek "kuyruk elemanları ters" değil. 'xs' tersi '' kuyruk elemanlarını ters çevir '' anlamına gelir, çünkü 'xs' kuyruk elemanlarıdır ve tersine çevirmek anlamına gelir. – immibis
Özyinelemede, "maksimum" ve "geri" işlevlerinin, söz konusu listenin _tail_ (yani, ilk öğeden başka bir şey) üzerinde çağrıldığını unutmayın. 'maksimum '[1,2,3]' yinelemeli olarak listeye uygulanır [2,3] '. Tamsayıların listesinin maksimum değeri 1 olan ilk liste elemanı ve 2. listenin geri kalanının maksimum değeridir. Bir listeyi '(x: xs)' yoluyla eşleştirdiğinde, 'x 'ilk liste öğesidir ve xs' geri kalanıdır (" kuyruk "). –
"Tersinin, kuyruk öğelerini ters çevirmesi anlamına geldiğini nasıl anlar". değil; ama bunu indüksiyonla kanıtlayabilirsin. '[]' Ve '[a]' vakalarıyla başlayın; sonra, [a, b] ', .... 'ye bir bakın, sonra da genel [a, b, ..., n] durumunda olduğunu varsayın ve bir sonraki olayı takip ettiğini kanıtlayın. a, b, ..., n, m], tersine dönüyor. –