首页 > 解决方案 > Haskell 不能压缩字符串然后与列表理解结合

问题描述

combineIndex :: String -> String -> [Char]
combineIndex pair1 pair2 = [a ++ b | (a, b) <- zip pair1 pair2]

combineIndex "AB" "CD"应该返回["AC", "BD"],但我只是不断收到类型错误。

标签: haskell

解决方案


combineIndex"AB" "CD"应该返回["AC", "BD"],但我只是不断收到类型错误。

那么让我们先来看看你的函数的签名:

combineIndex :: String -> String -> [Char]
combineIndex pair1 pair2 = [a ++ b | (a, b) <- zip pair1 pair2]

作为结果类型,您指定 a [Char],因此是Chars 的列表(实际上是 a String)。但是在你的结果中,你想要一个 的列表String,所以输出类型应该是 a [String]。所以让我们首先修复签名:

combineIndex :: String -> String -> [String]
combineIndex pair1 pair2 = [a ++ b | (a, b) <- zip pair1 pair2]

现在为了创建这样的字符串,我们可能首先分析所涉及的变量的类型。zip :: [a] -> [b] -> [(a, b)], 将返回一个 2-tuples 列表[(Char, Char)]。所以这意味着列表推导中的aandb都是Chars。我们可以String通过构造一个包含两个元素的列表将这些字符转换为 a [a,b]。所以我们可以通过以下方式修复该功能:

combineIndex :: String -> String -> [String]
combineIndex pair1 pair2 = [ [a, b] | (a, b) <- zip pair1 pair2]

(++) :: [a] -> [a] -> [a]函数在这里不起作用,因为它需要两个列表(具有相同类型的元素),并将这些列表连接在一起。但是 aChar不是列表, aString是(因为type String = [Char])。我们可以用 writteh[a] ++ [b]代替[a, b],但这只会使其噪音更大,效率更低。

请注意,我们可以将函数进一步推广到:

combineIndex :: [a] -> [a] -> [[a]]
combineIndex pair1 pair2 = [ [a, b] | (a, b) <- zip pair1 pair2]

所以现在它将适用于任何两个具有相同类型对象的列表。例如,如果我们用数字调用它,我们会得到:

Prelude> combineIndex [1,4,2,5] [1,3,0,2]
[[1,1],[4,3],[2,0],[5,2]]

推荐阅读