【问题标题】:How to properly generate a list of String through list comprehension in Haskell?如何通过 Haskell 中的列表理解正确生成字符串列表?
【发布时间】:2020-01-05 01:53:44
【问题描述】:

我需要使用 List Comprehension 生成一个类似这样的列表:["AaBB", "AbBB", "AcBB", "AdBB", "AeBB", "AfBB","AgBB"]。但我在创建表达式时遇到了一些问题

我尝试创建一个列表,其中每个元素都是字符串连接,类似于“A”+x+“BB”,其中 x 是一系列字母中的一个元素,以“a”开头并以“a”结尾“克”

module C where
    genList :: [String]
    genList = [ "A" ++ x ++ "BB" | x <- ["a" .. "g"]] 

所以,我希望生成一个类似于问题中所问的列表。但是我却得到了这个编译错误:

Prelude> :l exC
[1 of 1] Compiling C                ( exC.hs, interpreted )

exC.hs:3:41: error:
    • No instance for (Enum [Char])
        arising from the arithmetic sequence ‘"a" .. "g"’
    • In the expression: ["a" .. "g"]
      In a stmt of a list comprehension: x <- ["a" .. "g"]
      In the expression: ["A" ++ x ++ "BB" | x <- ["a" .. "g"]]
  |
3 |     genList = [ "A" ++ x ++ "BB" | x <- ["a" .. "g"]] 
  |                                         ^^^^^^^^^^^^
Failed, no modules loaded.

【问题讨论】:

    标签: string list haskell char


    【解决方案1】:

    您不能使用.. 语法来构建字符串列表。幸运的是,您在这里将它用于单字符串,因此您可以使用它来构建字符列表:[ "A" ++ x : "BB" | x &lt;- ['a' .. 'g']]

    【讨论】:

    • 对此进行扩展(我刚刚开始自己​​的答案,现在是多余的,但我相信这一点可能对 OP 有帮助):正如错误消息所说,.. 语法是仅为Enum 类型类的成员定义。具体来说,它是enumFromTo 函数的语法糖。 CharEnum 的实例而 String 不是的一个很好的理由。说“你好”之后的“下一个”字符串是什么?
    【解决方案2】:

    Strings 不是Enum typeclass 的实例。严格来说,可以将其作为一个实例,但这可能不会有太大的好处。因为这将产生"a""a\NUL""a\NUL\NUL" 等,如果我们按字典顺序产生这些。

    您可能想在这里使用Character,就像@JosephSible 在他的回答中写道:

    [ 'A': x : "BB" | x &lt;- [<b>'a'</b> .. <b>'g'</b>]]

    或者我们可以在这里使用仿函数映射:

    ('A':) . (:"BB") &lt;$&gt; ['a' .. 'g']

    这给了我们:

    Prelude> ('A':) . (:"BB") <$> ['a' .. 'g']
    ["AaBB","AbBB","AcBB","AdBB","AeBB","AfBB","AgBB"]
    

    【讨论】:

      猜你喜欢
      • 2010-09-22
      • 2022-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多