【问题标题】:Haskell using zip ranges and concatenationHaskell 使用 zip 范围和连接
【发布时间】:2023-03-05 09:53:01
【问题描述】:

尝试解决需要使用 zip、范围和连接来创建十六进制映射列表的问题,例如 [(0,0),(1,1),(2,2),(3,3), (4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(10,'A'),(11,'B' ),(12,'C'),(13,'D'),(14,'E'),(15,'F')]

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

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

我知道这些组列表的 Zip 会将我需要的映射列表放在一起,但我似乎无法将它们放在一起,并且 ++ 符号也是我们引入的唯一连接方法。任何帮助都会很棒。

【问题讨论】:

    标签: haskell concatenation


    【解决方案1】:

    确保你的类型匹配

    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)]
    

    【讨论】:

    • 非常感谢!在过去的几个小时里,我一直很沮丧 :) 我想我没有意识到我可以做到 ['0'..'9'] 或者这件事有区别,再次感谢!跨度>
    • 没问题:小提示:如果您仔细发布/阅读错误,您会更早得到答案;)
    猜你喜欢
    • 1970-01-01
    • 2011-12-30
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    相关资源
    最近更新 更多