Adi*_*Adi 6 haskell list-comprehension ghc
如果我有两个字符串,我使用列表推导来获得所需的结果:
combineStrings firstStr sndStr = [ [a,b] | a <- firstStr, b <- sndStr]
Run Code Online (Sandbox Code Playgroud)
对于三个字符串,我使用它
combineStrings firstStr sndStr trdStr = [ [a,b,c] | a <- firstStr, b <- sndStr, c <- trdStr]
Run Code Online (Sandbox Code Playgroud)
我正在尝试的是获得可变数量的字符串相同的结果.例如,如果我有一个采用以下形式的函数:
combineStrings :: [String] -> [String]
Run Code Online (Sandbox Code Playgroud)
我试图获得与上面2,3,... n列表相同的结果......我尝试了多种方式,比如这个
combineStrings [] = []
combineStrings (hd:tl) = [ a:b | a <- hd, b <- combineStrings tl]
Run Code Online (Sandbox Code Playgroud)
但是因为第一个条款的[]而失败了.有人可以帮我写这个吗?
Dan*_*her 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"]
Run Code Online (Sandbox Code Playgroud)
[]是的实例Monad,所以在这种情况下,签名变得sequence :: [[a]] -> [[a]]与a = Char,sequence :: [String] -> [String].
尝试
combineStrings [] = [""]
Run Code Online (Sandbox Code Playgroud)
或者更好(正如sdcwc所指出的):
combineStrings [] = [[]]
Run Code Online (Sandbox Code Playgroud)
否则,b <- combineStrings tl列表推导的部分将不会产生任何结果,b并且您将始终以空数组结束.
它作为边缘情况也是有意义的:组合来自零字符串的字符的唯一方法是空字符串(由零个字符组成).