在 Haskell 中,众所周知map
原语可用于将给定函数应用于all列表的元素:
λ> map toUpper "abcd"
"ABCD"
λ>
在尝试生成有限集(列表)的所有分区时,以下类似的原语会很方便:
λ> sap toUpper "abcd"
["Abcd","aBcd","abCd","abcD"]
λ>
with sap
代表连续申请。
类型签名将是:
sap :: (a -> a) -> [a] -> [[a]]
例如,集合“abcd”的部分分区可以通过使用('a':) sap'ing从“bcd”的分区中获得。
λ> 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 https://hoogle.haskell.org/给定类型签名,不会返回任何感兴趣的内容。
是否有这样的原语sap
存在于 Haskell 语言库中的某个地方???
或者有没有一种方法可以编写得如此简短,以至于它甚至不值得成为一个单独的函数,将其放在所谓的下面费尔贝恩阈值 https://wiki.haskell.org/Fairbairn_threshold ?
Footnote:
可以写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 )
本质上你从[[fn (last ls)]]
作为种子,然后向左前进。但这行人似乎并不简单。