list が与えられた場合、 s で:: [(Foo, Bar)]
scanl1 を実行したいのですが、それらの「タグ」は保持します。Bar
Foo
つまり、2 番目の引数として:: [(a, b)] -> ([b] -> [c]) -> [(a, c)]
カレーを渡すことができるように、 type の関数が必要です。scanl1
再帰的に書くことはできますが、これを行うための高階関数を構成する方法があるように感じます。
これは標準機能ですでに可能ですか?
list が与えられた場合、 s で:: [(Foo, Bar)]
scanl1 を実行したいのですが、それらの「タグ」は保持します。Bar
Foo
つまり、2 番目の引数として:: [(a, b)] -> ([b] -> [c]) -> [(a, c)]
カレーを渡すことができるように、 type の関数が必要です。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)]
あなたが望んでいたように。
つまり、unzip
?
http://zvon.org/other/haskell/Outputprelude/unzip_f.html
x = zip a c
where
(a, b) = unzip my_list
c = what_ever_you_want_on b
私の友人は、次の実装で来ましたkeeptags
:
import Control.Arrow
keeptags g (_,b) = second (g b)
今でも読めると思います。