Haskell:我们是否有mapCons的捷径

时间:2011-07-05 04:30:10

标签: haskell

我的意思是写这样一个函数:

mapCons x [] = [[x]]
mapCons x ys = map (x:) ys

这样:

*> mapCons 'a' []
["a"]
*> mapCons 'a' ["cat", "dog"]
["acat","adog"]

我们是否为mapCons提供了快捷方式或预定义函数? 我试过Hoogle a-> [[a]] - > [[a]],但找不到理想的。

非常感谢。

4 个答案:

答案 0 :(得分:11)

不,我注意到map (x:)长度为8个字符,而输入mapCons x为9个字符。对于这样的特定操作(即非通用操作),找到或记住它们的成本和难度远远超过了使用它们的好处。想象一下,如果前奏库或基础库定义了100,000个函数 - 不寒而栗!

答案 1 :(得分:2)

如果您import Control.Applicative,您可以执行以下操作:

GOA Control.Applicative> (:) 'a' <$> ["cat", "dog"]
["acat","adog"]
GOA Control.Applicative> (:) <$> [0] <*> [[1,2,3], [7,8,9]]
[[0,1,2,3],[0,7,8,9]]
GOA Control.Applicative> liftA2 (:) "a" ["cat", "dog"]
["acat","adog"]

我知道这不符合你发布的a->[[a]]->[[a]]签名,但你的问题有点不清楚你要做什么,所以我认为这仍然有帮助。

答案 2 :(得分:1)

您可以通过简单的列表理解轻松替换mapCons:

mapCons x ys = [x:y | y<-ys]

与其他解决方案一样,如果输入空[],则返回ys,而不是[[x]]作为您的定义。

答案 3 :(得分:1)

如果我们忽略空列表案例,正如FUZxxl注意到的那样,没有多大意义,你可能会注意到:

mapCons = map . (:)

当大声朗读时,会产生一些同义词,比如“mapCons等于由cons构成的地图”。

对我来说似乎没用。