2017-11-18 119 views
3

如何从列表中的'aa'到'zz'获取字符串? 我知道这很明显,但不知道解决这类问题的恰当习惯。只要用具体的例子来展示这个想法,我就会找出其余的。 谢谢。如何获得字符串'aa',ab'到'yz','zz'?

试图

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

但它不会编译。

+5

为什么不使用列表理解? '[[x,y] | x < - ['a'..'z'],y < - ['a'..'z']]' –

+5

这里不需要'(++)',因为它需要输入列表而不是字符。例如。 'liftA(\ x y - > [x,y])'具有所需的行为。为了将来的参考,如果你有没有编译的代码,请包括你实际得到的错误。 – user2407038

+1

你可以用'[[x] ++ [y] |]使'(++)'在这里工作。 x < - ['a'..'z'],y < - ['a'..'z']]' – RoadRunner

回答

6

所有这些做什么,你想要的(记住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]。您可以在returns S于的参数上面扔(++)Char s转换单列表,并把事情的工作:

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