17

Haskellプログラムを書く私はこのような演算子を必要としていることに気づきました。

(|>) :: a -> (a -> b) -> b
(|>) = flip ($)
infixl 0 |>

多くの機能をつなぎ合わせるときに便利だと思います。

tText cs = someFun cs   |>
           lines        |>
           map (drop 4) |>
           reverse

関数が適用される順序は関数が記述される順序と同じであるため、.私はそれを好みます。|>

tText' cs = reverse      . 
            map (drop 4) . 
            lines        . 
            someFun $ cs

質問は:これ( )は/他の基本的なライブラリ|>にすでに存在するものですか?Prelude単純なものを再実装することは、私が避けたい愚かなことです。

Hoogle検索は役に立ちませんでした。私が見つけた最も近いものは>>>(矢印)でしたが、それはやり過ぎのようです。

4

4 に答える 4

16

いいえ、私が知っている標準ライブラリには何もありません。何年も前に、私のコードの多くが私のbreifをインポートしましたが、便利なForwardsモジュールです。

> module Forwards where

> infixl 0 |>
> infixl 9 .>

> (|>) = flip ($)
> (.>) = flip (.)

私もあなたと同じ名前を使いました!

最近はあまり使わないので、関数合成の順番に慣れてきました。

自分の便利なショートカットを自由に使用してください。

また、以前よりも使用$量が少なくなっています。私が書いていた場所

thing = this $ that arg $ an other $ it

今私は書く

thing = this . that arg . an other $ it
于 2013-03-24T21:50:39.800 に答える
12

lensライブラリは、この演算子をとして&定義します。

于 2013-03-24T22:25:37.533 に答える
7

(|>)を「flipid」として定義することもできます。これが機能する理由を理解することは、Haskellで使用されている統合による型推論の優れた教訓です。

于 2013-03-25T21:38:48.040 に答える
0

私の経験では、そのような図書館は知りません。そして、そのようなライブラリが存在する場合は、それを使用しないことをお勧めします。


レンズパッケージを使用している場合を除き、そのような外部で定義された演算子は使用しないことをお勧めします。(そのレンズパッケージの場合、あなたは本当にそのようなオペレーターを必要とし、すでに持っています。)

私の経験では、私見など...

通常の構図とは対照的に、順方向の構図で読みやすさが向上する場合(レンズを扱う場合だけでなく)、そのモジュールで、またはまたはを介してローカルで特別な演算子を定義することが有益letですwhere。そのために、私はASCIIコンボではなく単一のUnicode記号を使用する傾向があります。

(·) = flip (.)
infixl 1 (·)

(§) = ($) -- left associative, no flip
infixl 0 (§)

数年前(レンズがなかったとき)、私もこれらのために自分のモジュールを定義することを考えました。しかし、その後、私はそのモジュールを使用するようになり、とにかく車輪の再発明をする傾向がありました。これらの演算子をライブラリに含めると、コードを読み取る作業が増える可能性があります。読者は、めったに使用されない演算子を調べる必要があります。その場合、ローカルで定義された演算子の方がはるかに優れています。

于 2013-04-04T11:57:43.973 に答える