没有++的haskell中的ConcatMap

Sim*_*ero 6 haskell

我试图在不使用++运算符的情况下为Haskell concatmap编写代码

concatMap :: (a -> [b]) -> [a] -> [b]
Run Code Online (Sandbox Code Playgroud)

并产生相同的结果

concatMap f = foldr ((++) . f) []
Run Code Online (Sandbox Code Playgroud)

我对Haskell还是很陌生,这只是我发现的一种练习。实际上,我什至不知道是否可以做到。

dfe*_*uer 11

这是使计算状态明确的一种方法:

concatMap :: (a -> [b]) -> [a] -> [b]
concatMap f = go []
  where
    -- We have b values; use one.
    go (b:bs) as = b : go bs as
    -- No bs left; get some more.
    go [] (a:as) = go (f a) as
    -- Nothing left; we're done.
    go [] [] = []
Run Code Online (Sandbox Code Playgroud)

这将维护bs 的当前列表,并在列表为空时将其填满。