3

所以我使用格雷码生成器来生成所有可能的长度为 6 的位字符串。生成器如下:

gray :: Integer -> String
gray n
 | n == 0 = [""]
 | n >  0 = map (++"0") (gray (n-1)) ++
            map (++"1") (reverse (gray (n-1)))

recipes = gray 6

然后,我尝试从这些字符串中的每一个中获取特定位并将该位转换为整数。我正在通过以下方式执行此操作:

cost' :: String -> Cost
cost' r i = toInteger( ord ( r!!i ) )

现在,由于某种原因,这不起作用。无论我使用什么 'i' 值,函数 cost' 将导致 48(如果列表的位置 2 中的位为 0 -> 例如 '100000')或 49(如果位置 2 中的位列表是 1 --> ex. '101000')。

为什么会这样对我来说没有任何意义。我的理解是字符串在 Haskell 中存储为列表,并且要从 Haskell 中的列表 'r' 中获取某个元素 'i',执行 'r! !一世'。

4

1 回答 1

5

那是因为ord返回字符的码位号,'0'就是码位48,'1'就是码位49。你要使用的函数是digitToInt

于 2012-10-08T20:42:14.590 回答