haskell - Haskell 不能压缩字符串然后与列表理解结合
问题描述
combineIndex :: String -> String -> [Char]
combineIndex pair1 pair2 = [a ++ b | (a, b) <- zip pair1 pair2]
combineIndex "AB" "CD"
应该返回["AC", "BD"]
,但我只是不断收到类型错误。
解决方案
combineIndex
"AB" "CD"
应该返回["AC", "BD"]
,但我只是不断收到类型错误。
那么让我们先来看看你的函数的签名:
combineIndex :: String -> String -> [Char]
combineIndex pair1 pair2 = [a ++ b | (a, b) <- zip pair1 pair2]
作为结果类型,您指定 a [Char]
,因此是Char
s 的列表(实际上是 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)]
。所以这意味着列表推导中的a
andb
都是Char
s。我们可以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]]
推荐阅读
- google-chrome - Chrome 如何在 Android 上实现 WebUSB?
- uwp - 对 UWP 项目未解决的依赖项进行故障排除
- java - 部署 GAE Java 应用程序时出错
- java - Cassandra 在没有 Thread.sleep 的情况下抛出 WriteTimeout 异常
- terminal - vs代码的集成终端中出现不需要的符号
- c# - 为什么 FormClosing 事件会在使用 Monitors 的同步线程作业中产生死锁?
- binary - 有符号整数转换
- php - FluidReview/SurveyMonkey Apply - webhook 格式/设置问题
- kubernetes - kuberneres 中的 helm install - 错误:此命令需要 2 个参数:版本名称、图表路径
- bash - 从文件夹路径中获取最后 3 个文件夹 - 用正斜杠分隔 - 使用 bash