如何获取 'aa', ab' 到 'yz', 'zz' 的字符串?

How to get strings 'aa', ab' up to 'yz', 'zz'?

如何获取列表中从 'aa' 到 'zz' 的字符串? 我知道这很明显,但不知道解决此类问题的正确成语。只要用具体的例子展示这个想法,我就会弄清楚剩下的。 谢谢

尝试过

(++) <$> ['a'..'z'] <*> ['a'..'z']

但它无法编译。

所有这些都做你想要的(记住String = [Char]):

Control.Monad.replicateM 2 ['a'..'z'] -- Cleanest; generalizes to all Applicatives
sequence $ replicate 2 ['a'..'z'] -- replicateM n = sequenceA . replicate n
-- sequence = sequenceA for monads
-- sequence means cartesian product for the [] monad

[[x, y] | x <- ['a'..'z'], y <- ['a'..'z']] -- Easiest for beginners
do x <- ['a'..'z']
   y <- ['a'..'z']
   return [x, y] -- For when you forget list comprehensions exist/need another monad
['a'..'z'] >>= \x -> ['a'..'z'] >>= \y -> return [x, y] -- Desugaring of do
-- Also, return x = [x] in this case
concatMap (\x -> map (\y -> [x, y]) ['a'..'z']) ['a'..'z'] -- Desugaring of comprehension
-- List comprehensions have similar syntax to do-notation and mean about the same,
-- but they desugar differently

(\x y -> [x, y]) <$> ['a'..'z'] <*> ['a'..'z'] -- When you're being too clever
(. return) . (:) <$> ['a'..'z'] <*> ['a'..'z'] -- Same as ^ but pointfree

原因

(++) <$> ['a'..'z'] <*> ['a'..'z']

不行是因为你需要(++) :: Char -> Char -> [Char],但你只有(++) :: [Char] -> [Char] -> [Char]。您可以在 (++) 的参数之上添加 returnss 以将 Chars 放入单例列表并使事情正常工作:

(. return) . (++) . return <$> ['a'..'z'] <*> ['a'..'z']