我有兩個字串;一個是主字串,另一個是兩個字符的字串(例如 "aa")。
我想看看我的主字串是否包含第二個字串并列印它在主字串中的索引。
我試著將主字串和它自己一起壓縮,這樣我就可以檢查每個字母的組合(例如,"abab"=(a,b)(b,a)(a,b))。我用[1.]來壓縮這些圖元,以獲得匹配字串可能開始的正確索引((a,b)0)。然后我用fst(fst h)從元組中提取第一個字母,看看它是否與我的二級字串的第一個字母匹配。如果它沒有找到任何匹配,它應該在主字串(xs)的其余部分再次運行。我使用where來宣告變數h作為head(locateZip x:xs)
locate(x:xs)(y: ys) = if fst(fst h) == y && snd(fst h) == ys then snd h else locate xs (y:yns)
where h = head(locateZip x:xs)
locateZip xs = zip(zip xs(tail xs)) [0...] 。
snd h用于列印元組的索引。
它應該回傳這樣的結果:
locate "aabba"/span> "aa"
0
定位 "bbaab" "aa"
2
我知道這可能看起來很不尋常,但我還是個新手,很難理解我得到的錯誤,以及什么是有效的,什么是無效的。
我在h上得到一個錯誤說:
Couldn't match expected type: (((Char, b2), b3) 與實際的type匹配。[((b0, b0), b1)]/span>
這個函式的where陳述句的使用是否正確?
uj5u.com熱心網友回復:
我在你的代碼中發現了三個問題。兩個是語法上的問題,一個是邏輯上的問題。我已經盡量少做改動。
首先,在where陳述句中,你必須使用()和": "運算子:
where h = head(locateZip (x:xs))
在你的代碼中,Haskell為locateZip函式推斷了一個不同的型別。
第二,在下面的比較中
snd(fst h) == ys
ys是一個串列而不是一個字符。這是因為": "運算子將一個串列分成了第一個元素和一個串列的尾部,就像在函式的開頭發生的那樣:
locate (x:xs) (y:ys)
現在,邏輯上的問題。使用where,只要呼叫locate函式,你就會生成一個zip串列。然而,每當 locateZip 函式被呼叫時,索引被重新生成。那么,在你原來的想法中,每當找到這一對時,locate 函式將輸出 0。
。還有一個問題,因為你的 locate 函式在開始時并沒有一個防護措施來停止遞回。好吧,經過一些修改,下面的代碼似乎和你預期的一樣:
locate [ ] _ = -1
locate phrase pair = locate_aux phrase pair (locateZip phrase)
locate_aux _ _ [] = -1
locate_aux (x:xs) (y1:y2:ys) h =
if (fst (fst (head h)) == y1) & & (snd (fst (head h)) == y2) then
snd (head h)
else[/span
locate_aux xs (y1:y2:ys) (tail h)
locateZip xs = zip(zip xs(tail xs)) [0...] 。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/316892.html
標籤:
上一篇:使用Perl在正則運算式中使用'eval'時如何保存匹配的部分?
下一篇:移除串列中第一個出現的元素
