Haskell列表理解可变数量的字符串

时间:2012-01-04 14:03:46

标签: haskell list-comprehension ghc

如果我有两个字符串,我使用列表推导来获得所需的结果:

 combineStrings firstStr sndStr = [ [a,b] | a <- firstStr, b <- sndStr]

对于三个字符串,我使用此

 combineStrings firstStr sndStr trdStr = [ [a,b,c] | a <- firstStr, b <- sndStr, c <- trdStr]

我正在尝试的是为可变数量的字符串获取相同的结果。例如,如果我有一个采用以下形式的函数:

 combineStrings :: [String] -> [String]

我正在努力获得与上面2,3,... n列表相同的结果......我尝试了多种方式,比如这个

 combineStrings []      = []
 combineStrings (hd:tl) = [ a:b | a <- hd, b <- combineStrings tl]

但由于第一个子句的[]而失败。有人可以帮我写这个吗?

2 个答案:

答案 0 :(得分:15)

值得注意的是:Haskell已经具备了这个功能,只是更为通用:

Prelude> :t sequence
sequence :: Monad m => [m a] -> m [a]
Prelude> sequence ["ab","cd","12"]
["ac1","ac2","ad1","ad2","bc1","bc2","bd1","bd2"]

[]Monad的一个实例,因此在这种情况下,签名变为sequence :: [[a]] -> [[a]]a = Charsequence :: [String] -> [String]

答案 1 :(得分:9)

尝试

combineStrings [] = [""]

或更好(由sdcwc指出):

combineStrings [] = [[]]

否则列表推导的部分b <- combineStrings tl将不会产生任何b,并且您将始终以空数组结束。

作为边缘情况也是有意义的:组合来自零字符串的字符的唯一方法是空字符串(由零个字符组成)。