3
如何從列表中的'aa'到'zz'獲取字符串? 我知道這很明顯,但不知道解決這類問題的恰當習慣。只要用具體的例子來展示這個想法,我就會找出其餘的。 謝謝。如何獲得字符串'aa',ab'到'yz','zz'?
試圖
(++) <$> ['a'..'z'] <*> ['a'..'z']
但它不會編譯。
如何從列表中的'aa'到'zz'獲取字符串? 我知道這很明顯,但不知道解決這類問題的恰當習慣。只要用具體的例子來展示這個想法,我就會找出其餘的。 謝謝。如何獲得字符串'aa',ab'到'yz','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]
。您可以在returns
S於的參數上面扔(++)
把Char
s轉換單列表,並把事情的工作:
(. return) . (++) . return <$> ['a'..'z'] <*> ['a'..'z']
爲什麼不使用列表理解? '[[x,y] | x < - ['a'..'z'],y < - ['a'..'z']]' –
這裏不需要'(++)',因爲它需要輸入列表而不是字符。例如。 'liftA(\ x y - > [x,y])'具有所需的行爲。爲了將來的參考,如果你有沒有編譯的代碼,請包括你實際得到的錯誤。 – user2407038
你可以用'[[x] ++ [y] |]使'(++)'在這裏工作。 x < - ['a'..'z'],y < - ['a'..'z']]' – RoadRunner