我的意思是写这样一个函数:
mapCons x [] = [[x]]
mapCons x ys = map (x:) ys
这样:
*> mapCons 'a' []
["a"]
*> mapCons 'a' ["cat", "dog"]
["acat","adog"]
我们是否为mapCons提供了快捷方式或预定义函数? 我试过Hoogle a-> [[a]] - > [[a]],但找不到理想的。
非常感谢。
答案 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构成的地图”。
对我来说似乎没用。