2016-03-25 3 views
8

バックパイプ(<|)演算子があり、他のいくつかのSO答えで参照されています。しかし、それはチェーンで一般的なフォワードパイプ(|>)と組み合わせるとうまくいかない。しかし、私は関連するオプションを探しています。基本的に、以下の関数定義の組み込みバージョンがありますか?それとも、これは悪い/危険な練習ですか?

let inline (^%) f = f 

let stuff = 
    [1;2;3] 
    |> Seq.filter ^% (>) 2 
    |> Seq.map ^% fun x -> x.ToString() 


// compare to this, which doesn't compile (and would be hard to follow even if it did) 
let stuff = 
    [1;2;3] 
    |> Seq.filter <| (>) 2 
    |> Seq.map <| fun x -> x.ToString() 
+0

[Function Application Operator($)in F#?]の可能な複製?(http://stackoverflow.com/questions/7183903/function-application-operator-in-f) –

+0

Nope。 http://stackoverflow.com/q/7183903/3909293 –

+0

私はハスケルについて十分な知識がありませんが、[FsControl](https://github.com/gmpl/FsControl)と回答を検索してください[Gustavo](http://stackoverflow.com/users/446822/gustavo?tab=answers) –

答えて

8

は、F#では使用できません使用してバッククォート、およびセクションを、挿入オプションのようないくつかのHaskellの機能があります。これにより、特定の構文がもう少し冗長になります。

通常、私は単純に上記のようなような機能のパイプを記述します

let stuff = 
    [1;2;3] 
    |> Seq.filter (fun x -> x < 2) 
    |> Seq.map string 

これは、私の意見では、はるかに読みやすいです。例えば、Seq.filter ^% (>) 2を使用して、私は直感的には「2よりも、すべての値が大きい」を意味するとことを読んだが、それはそれが何をするかではありません。

> let inline (^%) f = f;; 

val inline (^%) : f:'a -> 'a 

> let stuff = 
    [1;2;3] 
    |> Seq.filter ^% (>) 2 
    |> Seq.map ^% fun x -> x.ToString() 
    |> Seq.toList;; 

val stuff : string list = ["1"] 

あなたは何の疑いで、コードの読者を残す場合コードは、皆さんの生産性を低下させました。 Seq.filter (fun x -> x < 2)を使用すると、より冗長に見えるかもしれませんが、読者にはあいまいです。

+0

皮肉なことに私はもともと ' fun x - > x <2 "を入力して「誰かがそれを短縮する方法を指摘するだろう」と思っていました。 –

+0

http://blog.ploeh.dk/2016/03/01/ad-hoc-arbitraries-now-with-pipes/に関する '^%'対 '<|'についての考えは?私は彼らがそのような場合に同じことをすると思います。 '^%'は、それが '|>'チェーン内にあった場合に役立ちます。 –

+0

あなたは 'Gen.elements [4..8] |> Arb.fromGen |> Prop.forAll ^%fun neighborCount - > ...' –

関連する問題