我怎样才能浏览一个数字列表并将其与我正在浏览的另一个列表进行比较?
How can I go through a list of numbers and compare it with an another list I am going through?
我想输入两个字符串,例如“Hello”和“Hi”,我想同时遍历两个字符串中的每个元素,并逐个比较每个字符。实际程序中两个字符串的长度应该是5,如果一个char等于另一个,returntrue,否则returnfalse。
我想到的程序应该在“Hello”中看到 'H',在“Hi”中看到 'H',并且 return 为真,然后我希望它检查 'e' 在“你好”和 'i' 在“嗨”和 return 错误。我希望它继续这样做,直到没有什么可比较的。我想我可能需要使用递归,但我不确定如何在这个程序中真正实现它。
我尝试使用最大范围为 5 的 x:xs
,所以 [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
你想的太复杂了。
首先,根据经验,你应该永远不要使用!!
(无论是直接还是通过一些助手——uncurryingString
实际上正是与 !!
本身相同)。如果需要直接索引,列表不是正确的数据结构。但很多时候直接索引 不是 必需的,这正是其他一些没有模式匹配的编程语言习惯使用的方法,可以更优雅地完成它。
在您的应用程序中,您并行解构了两个字符串。嗯,你应该用模式匹配来表达:
match (a:as) (b:bs) (x:xs) = ...
现在您可以简单地直接比较 a
和 b
,无需搞乱任何列表理解或索引运算符。在示例中输入 "Hello"
和 "Hi"
,a
和 b
都将是 'H'
。
但您可能不想 return True
就在那里,因为还有剩余的字符串需要匹配。这就是递归的用武之地。
最后,您需要子句以防并非所有输入列表都是非空的。试着自己弄清楚。
您可能根本不需要额外的 [Int]
参数 (x:xs)
。 可能 有一个 depth-limiting 论点是有意义的,但这可能只是一个 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 = ...
...
在 Haskell 中,使用列表理解通常是计算事物的好方法,但在这种特殊情况下不是。
我可以试试这个代码:
[a==b | a <- "Hello", b <- "Hi"]
这是做什么的?您可能认为此 returns 为真,因为 'H' 字母匹配 - 或者您可能认为此 returns 为假,因为其他字母不匹配。事实上,它两者兼而有之 - 实际上,它是 运行 多个嵌套循环。
[True,False,False,False,False,False,False,False,False,False]
因此,要点是在需要嵌套循环或只处理一个数据集时使用列表理解。在这里,我们只需要一个并行处理两个单词的循环。所以一定是递归的。
我想输入两个字符串,例如“Hello”和“Hi”,我想同时遍历两个字符串中的每个元素,并逐个比较每个字符。实际程序中两个字符串的长度应该是5,如果一个char等于另一个,returntrue,否则returnfalse。
我想到的程序应该在“Hello”中看到 'H',在“Hi”中看到 'H',并且 return 为真,然后我希望它检查 'e' 在“你好”和 'i' 在“嗨”和 return 错误。我希望它继续这样做,直到没有什么可比较的。我想我可能需要使用递归,但我不确定如何在这个程序中真正实现它。
我尝试使用最大范围为 5 的 x:xs
,所以 [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
你想的太复杂了。
首先,根据经验,你应该永远不要使用!!
(无论是直接还是通过一些助手——uncurryingString
实际上正是与 !!
本身相同)。如果需要直接索引,列表不是正确的数据结构。但很多时候直接索引 不是 必需的,这正是其他一些没有模式匹配的编程语言习惯使用的方法,可以更优雅地完成它。
在您的应用程序中,您并行解构了两个字符串。嗯,你应该用模式匹配来表达:
match (a:as) (b:bs) (x:xs) = ...
现在您可以简单地直接比较 a
和 b
,无需搞乱任何列表理解或索引运算符。在示例中输入 "Hello"
和 "Hi"
,a
和 b
都将是 'H'
。
但您可能不想 return True
就在那里,因为还有剩余的字符串需要匹配。这就是递归的用武之地。
最后,您需要子句以防并非所有输入列表都是非空的。试着自己弄清楚。
您可能根本不需要额外的 [Int]
参数 (x:xs)
。 可能 有一个 depth-limiting 论点是有意义的,但这可能只是一个 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 = ...
...
在 Haskell 中,使用列表理解通常是计算事物的好方法,但在这种特殊情况下不是。
我可以试试这个代码:
[a==b | a <- "Hello", b <- "Hi"]
这是做什么的?您可能认为此 returns 为真,因为 'H' 字母匹配 - 或者您可能认为此 returns 为假,因为其他字母不匹配。事实上,它两者兼而有之 - 实际上,它是 运行 多个嵌套循环。
[True,False,False,False,False,False,False,False,False,False]
因此,要点是在需要嵌套循环或只处理一个数据集时使用列表理解。在这里,我们只需要一个并行处理两个单词的循环。所以一定是递归的。