缺少Haskell原语,以便将函数依次应用于列表的每个元素?

问题描述 投票:3回答:1

在Haskell中,众所周知map原语可用于将给定功能应用于列表的all元素:

 λ> map toUpper "abcd"
"ABCD"
 λ> 

[试图生成有限集(列表)的所有分区时,以下类似的基元将很方便:

 λ> sap toUpper "abcd"
["Abcd","aBcd","abCd","abcD"]
 λ> 

sap代表成功应用。类型签名为:

sap :: (a -> a) -> [a] -> [[a]]

例如,可以通过用('a':)取汁来从“ bcd”的分区中获取集合“ abcd”的部分分区。

 λ> pbcd = [["b","c","d"],["b","cd"],["bc","d"],["c","bd"],["bcd"]]
 λ> 
 λ> concatMap (sap ('a':)) pbcd
[["ab","c","d"],["b","ac","d"],["b","c","ad"],["ab","cd"],["b","acd"],["abc","d"],["bc","ad"],["ac","bd"],["c","abd"],["abcd"]]
 λ> 

然后可以通过添加'a'作为其自己的单独单例来获得5个丢失的分区。

我的问题是我无法在语言库中找到这样的原语,并且给定类型签名的Hoogle不返回任何感兴趣的东西。

[H]这样的原语是否存在于Haskell语言库的某个地方???还是有一种写得如此短而简单的方法,甚至不值得将其放在所谓的sap下?

脚注:可以这样写Fairbairn threshold

sap

基本上,您从sap :: (a -> a) -> [a] -> [[a]] sap fn ls = fst $ foldr op ([], []) ls where op x (ll,tl) = ( ((fn x):tl) : map (x:) ll , x:tl ) 开始作为种子,然后向左移动。但这似乎行人并不简单。

haskell combinatorics
1个回答
0
投票

我不认为它存在于任何地方,尽管当然不可能进行否定证明。写[[fn (last ls)]]的另一种方式,我可能更喜欢使用sap

© www.soinside.com 2019 - 2024. All rights reserved.