我有一个String
,如"1 2 3 4 5"
。如何将它转换为Haskell中的[1,2,3,4,5]
之类的整数列表?如果列表是"12345"
,该怎么办?
答案 0 :(得分:22)
您可以使用
Prelude> map read $ words "1 2 3 4 5" :: [Int]
[1,2,3,4,5]
我们使用words
在空格上拆分"1 2 3 4 5"
,以便获得["1", "2", "3", "4", "5"]
。 read
函数现在可以将单个字符串转换为整数。它的类型为Read a => String -> a
,因此它实际上可以转换为Read
类型类中的任何内容,其中包含Int
。这是因为我们需要在返回类型中指定类型变量来指定上面的类型。
对于没有空格的字符串,我们需要将每个Char
转换为单个元素列表。这可以通过将(:"")
应用于此来完成 - String
只是Char
的列表。然后我们像以前一样再次申请read
:
Prelude> map (read . (:"")) "12345" :: [Int]
[1,2,3,4,5]
答案 1 :(得分:8)
q1 :: Integral a => String -> [a]
q1 = map read . words
q2 :: Integral a => String -> [a]
q2 = map (read . return)
错误处理留作练习。 (提示:您将需要不同的返回类型。)
答案 2 :(得分:2)
模块Data.Char中定义了一个名为digitToInt的函数。它需要一个字符并返回一个数字,只要该字符可以解释为十六进制数字。
如果要在第一个示例中使用此函数,其中数字用空格分隔,则需要避免使用空格。你可以用一个简单的过滤器
来做到这一点> map digitToInt $ filter (/=' ') "1 2 1 2 1 2 1"
[1,2,1,2,1,2,1]
第二个示例,其中未完全分开的数字更加容易,因为您不需要过滤器
> map digitToInt "1212121"
[1,2,1,2,1,2,1]
我猜 digitToInt 比 read 更好,因为它不依赖于表达式的类型,这可能很棘手(这是我依然发现这篇文章= P)。无论如何,我是haskell的新手,所以我可能也错了=)。
答案 3 :(得分:0)
您可以使用:
> [read [x] :: Int | x <- string]