我试图在不使用++
运算符的情况下为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)
这将维护b
s 的当前列表,并在列表为空时将其填满。