2016-11-28 2 views
1

機能を持つ:Elmの関数に2つの引数を渡す方法はありますか?

f : Int -> Int -> Int 
f a b = 
    a + b 

はパイプAとBの両方の方法は何ですか?

Iv'eはここまでだが、私は括弧を取り除く方法があるかどうかを知りたい:それはあなたを満足しないことがありますが

main = 
    1 |> (2 |> f) |> toString |> text 
+2

を書くことができますが、私の質問は、あなたが実際にやろうとしているものです。あなたが提示したコードは私の疑いのあるプログラムでは起こりません。あなたのための最良の答えはあなたの本当のコンテキストに依存します –

答えて

5

は、1つの簡単な可能性がある。

(1、2)|> uncurry f

+0

F#はこのアイデアを取り入れて、あなたにコアライブラリのいくつかの配管オペレータを提供します(https:// github 。|>> 'に加えて、.com/fsharp/fsharp/blob/master/src/fsharp/FSharp.Core/prim-types.fs#L3891-L3895) 2つ、 '|||>'を含み、これらのパイプはサイズ3のタプルをパイプしていきます。 –

+1

ブラッカーだけを取り除くには、 '1 |> f 2 |> toString |> text'で十分です。しかし、もちろん、まだ2つの引数をパイプしていません。 – wintvelt

0

私は想像しませんでした。私はそれを見たことがない。その理由はそれほど起こりそうにないということは、技術的にすべてのelm関数は1つの引数しか取らないということです。しかし、このようなことはどうですか?

add 1 2 3 

まあ、エルムは、実際にカレー機能だし、二番目の引数を取り、それは第二引数を取り、第三引数を返す最初の引数の後に無名関数を返します。複数の引数とreturn文.....

add : Int -> Int -> Int 

の間には別離がありませんように型注釈を見て、なぜあなたが疑問に思っている場合がありませんので...それはです!

3

配管用に配管しないでください。あなたの例にあるものよりも1 |> f 2 |> toString |> textと言うのはきれいです。パイプライン化された引数は、慣例により常に最後の引数であるため、しばしばデータ構造体です。のは、より現実的な例を見てみましょう:

"40" 
    |> String.toInt 
    |> Maybe.map (\n -> n + 2) 
    |> Maybe.withDefault 2 

データ構造(チェーンの一部のためのMaybe Int)はいえパイプで連結されている間の直接引数(ラムダ、2)は動作に影響を与えます。コントラスト:Maybe.withDefault 2 (Maybe.map (\n -> n + 2) (String.toInt "40"))。パイプがコンパイラによって最適化されるので、この醜いバージョンはさらに速くはありません。

このスタイルであなたパイプは、データ構造に変換、あなたはパイプに2つの項目が必要ない場合

0

あなたは、このような類似した流れ達成することができます:。

1 :: 2 :: [] |> List.foldl f 0 |> toString |> text 

を考え方は、::を使用して、引数を含むListを作成することです。次に、foldlを使用して、関数fを引数に適用します。

もちろん、シンタックスには余分な項目があります。空の数字はListで、開始値はfoldlです。欠点は、あなたがまだあなたはおそらく、単にの頭だったい、に対処するための初期値を持っていると思いますです

let 
    g = List.foldl f 0 
in 
    1 :: 2 :: [] |> g |> toString |> text 

:あなたの例の機能を続けると、あなたは隠す開始値に組成物を使用することができますリスト(例1)。しかし、リストの先頭を開始値として使用しようとすると、別の問題が発生します。

開始値(空のリスト)がない場合、foldは何も戻せず、すべてのElm関数戻り値があります。

いずれにせよ、このアプローチが役立ちます。

1

|>パイプは、最初に左端を評価し、最初の引数を2番目の引数に適用します。これは必要ではありません。 <|パイプが最初に右側を評価します。これはあなたが望むものではなく、第2引数を最初のものに適用します。これはあなたが望むものではありません。

関数アプリケーションを逆転させるラムダで丸めることができます。この

add a b = a + b 

add 
    |> \f -> f 2 
    |> \f -> f 3 

-- outcome: 5 

好きか、あなたは下の2つの良い答えを持っているヘルパー関数

invert v f = f v 

add 
    |> invert 2 
    |> invert 3 
関連する問題