prefix :: String -> String -> Bool
prefix [] _ = True
prefix _ [] = False
prefix (x:xs) (y:ys) = (x == y) && (prefix xs ys)
我有這個 Haskell 函式,我們在其中檢查第一個字串是否是另一個字串的前綴。
我真的無法理解一些事情。
為什么前綴 [] _ 是真的?為什么反過來說它是假的?我的意思是,如果兩者都是空的,那么什么都不是什么的前綴不應該是真的嗎?
另外,我是否了解該功能如何正常作業?
我們從第一個字串中取出第一個符號,然后從第二個字串中取出第一個符號,看看它們是否相等,然后我們用短一個字符的字串呼叫相同的函式?
此外,我們使用前綴實作來創建一個函式子字串,它檢查一個字串是否是另一個字串的一部分
substring :: String -> String -> Bool
substring x y
| length x > length y = False
| otherwise = prefix x y || substring x (tail y)
我也無法理解 substring 函式的一般作業原理。如果長度 x 大于 y,為什么它一定是前綴?
uj5u.com熱心網友回復:
我的意思是,如果兩者都是空的,那么什么都不是什么的前綴不應該是真的嗎?
如果兩者都為空,則第一個子句將觸發并回傳True。第一個子句沒有說明第二個引數。它只是說“如果第一個串列是空的,那么它就是True。這意味著我們在第二個子句中知道第一個串列不是空的。
另外,我是否了解該功能如何正常作業?
第一個子句說如果前綴是一個空串列,那么第一個串列是第二個串列的前綴。第二個子句表示如果字串為空(并且前綴不為空),則第一個串列不是第二個串列的前綴。
最后最后一個子句說,如果兩個串列都不為空,那么如果兩個串列的第一個元素相同,第一個串列是第二個串列的前綴,并且前綴的尾部是第二個串列的尾部的前綴細繩。因此,最后一個子句會將游標移到兩個串列的右側,并檢查剩余的前綴是否是剩余字串的前綴。
uj5u.com熱心網友回復:
我們從第一個字串中取出第一個符號,然后從第二個字串中取出第一個符號,看看它們是否相等,然后我們用短一個字符的字串呼叫相同的函式?
您對函式作業原理的理解是正確的。
該函式接受 2 個字串引數,并檢查第一個引數是否是第二個的前綴。空字串[]始終是任何其他字串的前綴,這就是它True為 input回傳的原因[] _。反之則不然,非空字串x不是空字串的前綴y。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/359154.html
