如果我有两个字符串,我使用列表推导来获得所需的结果:
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]
但由于第一个子句的[]而失败。有人可以帮我写这个吗?
答案 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 = Char
,sequence :: [String] -> [String]
。
答案 1 :(得分:9)
尝试
combineStrings [] = [""]
或更好(由sdcwc指出):
combineStrings [] = [[]]
否则列表推导的部分b <- combineStrings tl
将不会产生任何b
,并且您将始终以空数组结束。
作为边缘情况也是有意义的:组合来自零字符串的字符的唯一方法是空字符串(由零个字符组成)。