我想輸入兩個字串,例如“Hello”和“Hi”,我想同時遍歷兩個字串中的每個元素并逐個比較每個字符。實際程式中兩個字串的長度應該是5,如果一個char相等,回傳true,否則回傳false。
我想到的程式應該在“Hello”中看到“H”,在“Hi”中看到“H”并回傳真,然后我希望它檢查“Hello”中的“e”和“Hi”中的“i”并回傳假。我希望它繼續這樣做,直到沒有什么可比較的。我想我可能需要使用遞回,但我不確定如何在這個程式中真正實作它。
我嘗試使用x:xs最大范圍 5 so [0..5],但它根本不起作用。
我的代碼(不作業):
uncurryingString :: String -> Int -> Char
uncurryingString a b = a !! b
match :: String -> String -> [Int] -> Bool
match a b (x:xs)
| uncurryingString a [x 1 | x <- xs] == uncurryingString b [x 1 | x <- xs] = True
| otherwise = False
uj5u.com熱心網友回復:
你想這個方法太復雜了。
首先,根據經驗,你永遠不應該使用!!(無論是直接使用還是通過一些助手——uncurryingString實際上與它自己完全一樣!!)。如果需要直接索引,則串列不是正確的資料結構。但通常不需要直接索引,它只是在其他一些沒有模式匹配的編程語言中習慣使用的,以便更優雅地完成它。
在您的應用程式中,您正在并行解構兩個字串。好吧,你應該用模式匹配來表達:
match (a:as) (b:bs) (x:xs) = ...
現在您可以簡單地直接比較a,b無需搞亂任何串列推導或索引運算子。在示例中輸入"Hello"and "Hi",兩者a和b都將在'H'這里。
但是您可能不想直接回傳True那里,因為還有要匹配的字串的其余部分。這就是遞回的用武之地。
最后,如果不是所有輸入串列都是非空的,您需要使用子句。試著自己弄清楚。
您可能根本不需要額外的[Int]引數(x:xs)。有一個深度限制引數可能是有意義的,但這可能只是一個Int. 然后你會做類似的事情
match :: Eq a => [a] -> [a] -> Int -> Bool
match _ _ 0 = True -- lists are equal up to the specified max depth
match (a:as) (b:bs) n = ...
...
uj5u.com熱心網友回復:
使用串列推導通常是在 Haskell 中計算事物的好方法,但在這種特殊情況下并非如此。
我可以試試這段代碼:
[a==b | a <- "Hello", b <- "Hi"]
這是做什么的?您可能會認為這會回傳 True,因為“H”字母匹配 - 或者您可能會認為這會回傳 False,因為其他字母不匹配。事實上,它兩者兼而有之——實際上,它正在運行多個嵌套回圈。
[True,False,False,False,False,False,False,False,False,False]
因此,當您需要嵌套回圈或僅處理一個資料集時,要點是使用串列推導。在這里,我們只需要一個并行處理兩個單詞的回圈。因此它必須是遞回的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/427295.html
標籤:哈斯克尔
上一篇:什么是單位型別?
