gpt4 book ai didi

haskell - concatMap 有什么作用?

转载 作者:行者123 更新时间:2023-12-03 10:54:24 29 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Difference between concatMap f xs and concat $ map f xs?

(1 个回答)


7年前关闭。



concatMap 是什么意思做?
我知道concatmap做。是两者结合在一起还是完全不同的功能?

最佳答案

是的,concatMap函数只是 concatmap放在一起。由此得名。将函数放在一起只是意味着组合它们:

(.) :: (b -> c) -> (a -> b) -> a -> c

然而 concatmap由于 map 的类型签名,不能通过简单地使用函数组合来组合在一起。 :
map :: (a -> b) -> [a] -> [b]
-------- --- ---
a b c

如您所见,函数组合需要 a -> b 类型的函数, 但是 mapa -> b -> c 类型.撰写 concatmap您需要使用 .:运算符:
(.:) :: (c -> d) -> (a -> b -> c) -> a -> b -> d
concat函数的类型签名为:
concat :: [[a]] -> [a]
----- ---
c d

因此 concat .: map是类型:
concat .: map :: (a -> [b]) -> [a] -> [b]
---------- --- ---
a b d

concatMap 相同:
concatMap :: (a -> [b]) -> [a] -> [b]
.:运算符本身可以写成函数组合:
(.:) = (.) (.) (.)

-- or

(.:) = (.) . (.)

因此 concatMap可以写成:
concatMap = (.) (.) (.) concat map

-- or

concatMap = (concat .) . map

-- or

concatMap = concat .: map

如果您 flip concatMap 的论点你会得到 >>=列表单子(monad)的(绑定(bind))功能:
instance Monad [] where
return x = [x]
(>>=) = flip concatMap
fail _ = []

flip concatMap :: [a] -> (a -> [b]) -> [b]

>>= :: Monad m => m a -> (a -> m b) -> m b

这使它与 =<< 相同。列表单子(monad)的功能:
concatMap :: (a -> [b]) -> [a] -> [b]

=<< :: Monad m => (a -> m b) -> m a -> m b

所以现在你知道了关于 concatMap 的一切。 .只是 concat应用于 map 的结果.由此得名。

关于haskell - concatMap 有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5225396/

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