【发布时间】:2012-02-11 08:35:02
【问题描述】:
我有一个String,比如"1 2 3 4 5"。如何将其转换为 Haskell 中的 [1,2,3,4,5] 等整数列表?如果列表是"12345"怎么办?
【问题讨论】:
-
-1,你可以添加你尝试过的代码吗?
我有一个String,比如"1 2 3 4 5"。如何将其转换为 Haskell 中的 [1,2,3,4,5] 等整数列表?如果列表是"12345"怎么办?
【问题讨论】:
你可以使用:
> [read [x] :: Int | x <- string]
【讨论】:
在模块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的新手,所以我可能错了=)。
【讨论】:
q1 :: Integral a => String -> [a]
q1 = map read . words
q2 :: Integral a => String -> [a]
q2 = map (read . return)
错误处理留作练习。 (提示:您将需要不同的返回类型。)
【讨论】:
你可以使用
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 只是Chars 的列表。然后我们像以前一样再次申请read:
Prelude> map (read . (:"")) "12345" :: [Int]
[1,2,3,4,5]
【讨论】: