【问题标题】:Generate a String Array with a different amount of Chars in Haskell在 Haskell 中生成具有不同数量字符的字符串数组
【发布时间】:2013-10-27 18:28:03
【问题描述】:

我需要这样的东西:

[[i]++[j]| i <- ['a'..'d'], j <- ['a'..'d']] where I get the output:
["aa","ab","ac","ad","ba","bb","bc","bd","ca","cb","cc","cd","da","db","dc","dd"]

我需要的是一种更动态的方式来生成这个输出数组。所以如果得到一个整数值 3 我应该看起来像:

[[i]++[j]++[k]| i <- ['a'..'d'], j <- ['a'..'d'], k <- ['a'..'d']

【问题讨论】:

    标签: list haskell combinations


    【解决方案1】:
    replicateM n ['a'..'d']
    

    n 是重复的次数。

    【讨论】:

    • 但是我没有得到我需要的排列。所以如果我取 n = 5 或者我做错了什么,我只会得到输出 '["abcd","abcd","abcd","abcd","abcd"]'?
    • 你写的是replicate,而不是replicateM
    • 好吧,我的错 :) 现在我写了replicateM,但是拥抱编译器说:错误-未定义的变量“replicateM”
    • 你需要导入Control.Monad
    • 非常感谢...这对我很有用。几秒钟前才找到它:)
    【解决方案2】:

    澄清一下 Louis Wasserman 的回答:

    replicateM i m 等价于:

    do a1 <- m
       a2 <- m
       a3 <- m
       ...
       ai <- m
       return [a1, a2, a3, ..., ai]
    

    例如,replicateM 3 getLine 是一个 IO [String] 操作,它将获得三行并为您提供字符串列表:

    do line1 <- getLine
       line2 <- getLine
       line3 <- getLine
       return [line1, line2, line3]
    

    现在,请记住,列表推导式只是 [] Monad 的花哨语法:

    [[i, j] | i <- ['a'..'d'], j <- ['a'..'d']]
    
    =
    
    do i <- ['a'..'d']
       j <- ['a'..'d']
       return [i, j]
    

    这正是replicateM 2 ['a'..'d'] 的样子。

    【讨论】:

    • ...和replicate(没有M)只需要一个项目并将其中的N个放入列表中。
    【解决方案3】:

    你可以使用以下

    seq i xs | i > 0 = [x:ys | x <- xs, ys <- seq (i-1) xs]
             | otherwise = [[]]
    

    【讨论】:

      猜你喜欢
      • 2012-01-12
      • 2021-07-19
      • 1970-01-01
      • 2015-09-08
      • 2014-03-07
      • 1970-01-01
      • 1970-01-01
      • 2016-05-06
      • 2022-01-24
      相关资源
      最近更新 更多