私はどちらがするか知っ(||>)
ています(a' * 'b) -> ('a -> b' -> 'c) -> 'c
しかし、私はこれが非常に便利であることに気づき、車輪を再発明しているのかどうか疑問に思いました:
// ('a * 'a) -> ('a -> 'b) -> ('b * 'b)
let inline (|>>) (a,b) f = (f a, f b)
(*起こりうることです。私はこのceil
機能を 30 分前に発見しただけです!)
いいえ、そうではありません。
ただし、FParsec を使用している場合は、その亜種に頻繁に遭遇します。FParsec ドキュメントの型シグネチャは次のとおりです。
val (|>>): Parser<'a,'u> -> ('a -> 'b) -> Parser<'b,'u>
ライブラリには、他の目的にも一般化できる非常によく設計された一連の演算子があると思います。FParsec オペレーターのリストは、ここにあります。
少し掘り下げました。を使用して定義するのは簡単ですが、 operator にはHaskell の対応|>>
するものが組み込まれていないようです。Control.Arrow
あなたが説明した演算子は、基本的にmap
2要素タプルの関数です。一般map
に、関数には署名があります ( F# ライブラリの他の多くの型でF<'a>
ある可能性があるもの)。seq<'a>
map : ('a -> 'b) -> F<'a> -> F<'b>
したがって、F<'a>
2 要素のタプルとして定義すると、関数は実際には次のようになりますmap
(引数を反転した場合)。
type F<'a> = 'a * 'a
let map f (a, b) = (f a, f b)
この操作は F# ライブラリのどこにも組み込まれていませんが、他の場所の F# ライブラリで非常に一般的なパターン (リスト、seq、配列など) と実際に一致することを認識すると便利です。
@pad によって参照される Haskell の回答を見る - 原則として、Haskell は、型クラスfmap
を使用してそのような操作をサポートするすべての型に対して同じ関数を定義することを可能にします (したがって、代わりにSeq.map
または代わりにあなたのを書くことになりますTwoElementTuple.map
が、実際にはそうではありませんさまざまな技術的な理由で動作するため、Haskeller は別の方法で呼び出す必要があります)。
F# では、map
異なる型に対して 1 つの関数を定義することは容易ではありませんが、関数map
を 2 要素タプルの と考えることができます (たとえ、お名前map
)