Haskell使用zip范围和连接

时间:2014-10-11 08:26:35

标签: haskell concatenation

尝试解决需要使用拉链,范围和范围的问题。连接以创建十六进制映射列表,如[(0,0),(1,1),(2,2),(3,3),(4,4),(5,5),(6,6) ),(7,7),(8,8),(9,9),(10,' A&#39),(11,' B&#39),(12,& #39; C&#39),(13,' d&#39),(14,' E&#39),(15,' F&#39)]

我一直在尝试像zip [0..9] [0..9] ++ zip [10..15] ['A'..'F']

这样的事情

zip [[0..9] [0..9] ++ [10..15] ['A'..'F']]

我理解这些组列表的Zip会将我需要的映射列表放在一起,但我似乎无法将它们组合在一起,++ Sign是我们引入的唯一的concatentaion方法。任何帮助都会很棒。

1 个答案:

答案 0 :(得分:3)

确保您的类型匹配

zip [0..9] ['0'..'9'] ++ zip [10..15] ['A'..'F']

要了解这是为什么,请在ghci中播放:

Prelude> :t zip [0..9] [0..9]
zip [0..9] [0..9] :: (Num b, Num a, Enum b, Enum a) => [(a, b)]

Prelude> :t zip [10..15] ['A'..'F']
zip [10..15] ['A'..'F'] :: (Num a, Enum a) => [(a, Char)]

正如您在第二部分中看到的那样,您使用字符压缩了一些数字但第一部分 压缩的数字和数字。现在GHC不知道如何从数字文字中创建Char 比如09,甚至试图告诉你:

Prelude> zip [0..9] [0..9] ++ zip [10..15] ['A'..'F']

<interactive>:9:13:
    Could not deduce (Num Char) arising from the literal ‘0’
    ...

这就是你需要像这样做第一部分的原因:

Prelude> :t zip [0..9] ['0'..'9']
zip [0..9] ['0'..'9'] :: (Num a, Enum a) => [(a, Char)]