5

リストをそれ自体に圧縮する関数は、次のように定義できます。

let adjacent1 l = zip l $ tail l

これは機能しますが、ポイントフリースタイルで定義したいと思います。これを行うために、私は関数を定義しますdollarize

let dollarize f1 f2 x = f1 x $ f2 x
let adjacent1 = dollarize zip tail

これは機能しますが、明らかに私は自分自身の高階関数を定義したくありません。dollarizeそれが存在すると仮定して、の標準的な同等物を見つける方法はありますか?そうでない場合、機能を組み合わせるために存在するこの種の機能はどこにありますか?

4

3 に答える 3

11

ツールはpointfree自動的にこれを行うことができます。

$ pointfree "\l -> zip l (tail l)"
ap zip tail
$ pointfree "\f1 f2 x -> f1 x $ f2 x"
ap
于 2012-10-24T21:46:24.557 に答える
6

Applicativeのインスタンスを使用してみ(->) aませんか?

Prelude Control.Applicative> :t zip <*> tail
zip  <*> tail :: [a] -> [(a, a)]
Prelude Control.Applicative> zip <*> tail $ [1 .. 4]
[(1,2),(2,3),(3,4)]

短くて甘い。

于 2012-10-24T21:15:53.013 に答える
3

@DanielFischerの答えによると。また、次のモナドインスタンスを使用できます(->) a

Prelude Control.Monad.Instances> let adjacent1 = tail >>= flip zip
Prelude Control.Monad.Instances> adjacent1 [1..4]
[(1,2),(2,3),(3,4)]
于 2012-10-24T21:22:34.290 に答える