([b] -> [c]-6ren">
gpt4 book ai didi

haskell - "Mapping"扫描

转载 作者:行者123 更新时间:2023-12-04 13:17:08 28 4
gpt4 key购买 nike

给定一个列表 :: [(Foo, Bar)] ,我想在 Bar 上执行 scanl1 s,但保留他们的 Foo “标签”。

IE。我想要一个类型为 :: [(a, b)] -> ([b] -> [c]) -> [(a, c)] 的函数,这样我就可以通过一个 curry scanl1作为第二个论点。

我可以递归地编写它,但感觉好像有一种方法可以组合高阶函数来做到这一点。

这是否已经可以通过标准功能实现?

最佳答案

您可以提升组合函数以线程化 Foo,而不是编写不令人满意的高阶函数。标记通过,以便您仍然可以使用 scanl1 ,这就是你的意思。

keeptags :: (Bar -> Bar -> Bar) -> (Foo,Bar) -> (Foo,Bar) -> (Foo,Bar)
keeptags g (_,b) (a',b') = (a',g b b')

现在您可以使用 scanl1 ;带上您的原件 qux :: Bar -> Bar -> Bar和做
scanQux :: [(Foo,Bar)] -> [(Foo,Bar)]
scanQux = scanl1 (keeptags qux)
keeptags很简单, scanQux晶莹剔透。

例如,如果
type Foo = Char
type Bar = Int

qux = (+)

然后你得到
*Main> scanl1 qux [1..9]
[1,3,6,10,15,21,28,36,45]

*Main> zip "HELLO MUM" [1..9]
[('H',1),('E',2),('L',3),('L',4),('O',5),(' ',6),('M',7),('U',8),('M',9)]

*Main> scanQux $ zip "HELLO MUM" [1..9]
[('H',1),('E',3),('L',6),('L',10),('O',15),(' ',21),('M',28),('U',36),('M',45)]

如你所愿。

关于haskell - "Mapping"扫描,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12204345/

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