我正在尝试学习如何将一个包含多个数字的整数分成一个[Integer]
,并且我之前看过一篇关于此的文章,他们只是使用模 10 运算符一遍又一遍地查找最后一个/余数并将该数字分配给an 的开头[Int]
,但为什么不能简单地使用 show 函数将数字转换为 a String
(我相信等于 a [Char]
),然后将 read 函数映射到Char
in 中的每个位置以获取[Char]
每个点的整数值[Char]
一个[Integer]
?
我想象的代码几乎就像这样:
deconstructor :: Integer -> [Integer] //(or trying [Char])
deconstructor n
| n < 0 = map read (show (n * (-1)))
| n == 0 = [read "0"] //(This line works)
| otherwise = map read (show n) //(or in [] or with :: [Integer] on the end)
它给出的错误总是类似于:
* Couldn't match type `Char' with `[Char]'
Expected: [String]
Actual: String
只是处理show n
编译良好并给出String
/ [Char]
,我理解映射的方式是它只是对右侧数组的每个索引执行左侧的操作(在本例中读取)(我想象的是 a [Char]
),所以我不太明白是什么?是否必须String
已经分成不同的[String]
s 或者其他什么?
是的,您已经正确诊断了问题。
问题是
read
必须对 a 进行操作String
,而不是对 single进行操作Char
。如果你read "1234"
,你正在申请read
aString
,一切都很好,但如果你map read "1234"
,你正在申请read
,('1' :: Char)
then('2' :: Char)
,等等,Haskell 不会接受这种类型的不匹配。您可以使用from作为以下内容的一部分将每个字符转换
Char
为一个字符:String
singleton
Data.List
map
或者您可以使用该函数
(:[])
代替singleton
.:
这是一个对每个字符(对于“头”)和空列表[]
(对于“尾”)执行 cons 操作的“部分” 。我提到这一点只是因为它在“野外”的 Haskell 代码中非常常见,所以你会经常看到它的使用:因此,以下内容应该有效:
请注意,您实际上并不需要这种
n == 0
情况,因为它只是更一般情况的特殊情况。