gpt4 book ai didi

haskell - 如何获取字符串 'aa' 、 ab' 到 'yz' 、 'zz' ?

转载 作者:行者123 更新时间:2023-12-02 20:58:11 24 4
gpt4 key购买 nike

如何获取列表中从“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] -> [字符] -> [字符]。您可以在 (++) 的参数顶部添加 returns ,以将 Char 放入单例列表中并让事情正常工作:

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

关于haskell - 如何获取字符串 'aa' 、 ab' 到 'yz' 、 'zz' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47363263/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com