我做了這些函式:
我做了這些函式。
--在dict中查找并回傳 Maybe key。
myLookUp :: [(String, [String]) -> String -> String] ->
myLookUp [] val = [] 。
myLookUp ((k, vs):ds) val
| val `elem` snd (myLast ds) = myCensor val
| 價值 `elem` vs = k
|否則 = myLookUp ds val
--給定一個字串圖元的dict和字串的串列,
--應該回傳dict中最后一個元組。
myLast :: [(String, [String]) -> (String, [String])
myLast [] = error "empty list"。
myLast [x] = x
myLast (x:xs) = myLast xs
這可以編譯,但當我試圖測驗它時,我得到一個錯誤說
ghci> myLookUp [("strength", ["ignorance"])。("bla", ["blabla", "blabla"]) ] "aa"] "aa"
*** Exception: Empty list
CallStack(來自HasCallStack)。
錯誤,在test.hs:103:13 in main:Main呼叫。
而如果我試圖洗掉我的基本案例myLast [] = error "Empty list",我得到這個錯誤:
myLookUp [("strength", [" ignorance"])。("bla", ["blabla", "blabla"]) ] "aa"] "aa"Exception: test.hs:(104,1)-(105, 25) 。
Non-exhaustive patterns in function myLast
我認為myLast是有效的,因為我得到這樣的輸出:
myLast [(" strength", ["ignorance"]), ("bla", ["blabla", "blabla")]
("bla",["blabla","blabla"] )
我想我可以在元組上使用snd來獲得串列元素,但是由于我得到了這個錯誤,我不確定我做錯了什么。
uj5u.com熱心網友回復:
試著仔細想想你想做什么。你之所以在這里得到一個空串列的例外,是因為你試圖向 myLast 傳遞一個可能為空的串列(并且在最后一次迭代時將為空)。你的防護措施中沒有檢查輸入串列(ds)中何時剩下一個元素。你可以通過添加:
來做到這一點。| null ds = [] 。
或者檢查函式模式中的單一元素。此外,myLast函式與內置的prelude函式 "last "相同,所以它可以替代它。 另外,請記住你對ds的空檢查的位置,它必須在你試圖使用ds之前,但在你的第一次檢查之后:
myLookUp :: [(String, [String]] -> String -> String] ->
myLookUp [] val = [] 。
myLookUp ((k, vs):ds) val
| val `elem` vs = k
| null ds = []
| val `elem` snd (last ds) = myCensor val
|否則 = myLookUp ds val
解決這個問題的一個更好的方法是在每次迭代中只檢查頭部的元素,在每次迭代中檢查最后一個元素是非常低效的,而你只需要做一次,而且無論如何都會在遞回回圈的最后一次迭代中完成。
uj5u.com熱心網友回復:
以下是你試圖做的事情:
你想做什么?
給定一個將鍵(字串)映射到值(字串串列)的字典,以及一個要查找的字串-值,首先確定給定的值是否存在于字典的最后一個條目中的串列中。如果是,則審查該值并回傳。否則,確定給定值是否存在于某個值串列中;如果是,回傳相關的鍵。如果不是,則回傳 Nothing。讓 "需要審查的字串串列 "成為一個單獨的引數不是更合理嗎?那么解決方案將是:
import Data.List (find) myLookup :: [String] -> [(String, [String]) -> String ->Maybe String myLookup toCensor dict val | val `elem` toCensor = Just $ myCensor val | Just (key, _) <- find ((_, vs) -> val `elem` vs) dict = Just key | 否則 = Nothing轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/329825.html
標籤:
下一篇:app=Flask(__name__)TypeError:'module'objectisnotcallable
