3

コードを持っています:

 //e = 1/2*Sum((yi -di)^2)
    let error y d =
        let map = 
            Array.map2 (fun y d -> (y - d) ** 2.0) y d
        let sum = 
            Array.sum map
        (sum / 2.0)

    let error2 y d =
        Array.map2 (fun y d -> (y - d) ** 2.0) y d
        |> Array.sum
        |> (/) 2.0

私が理解したように、これらの関数は同じ結果を生成するはずですが、結果には大きな違いがあります。誰でもこれを説明できますか?

ps 簡単な例:

let test = [|1..10|]
    let res = test
                |> Array.sum
                |> (/) 5

テスト = 11 (sum(1..10) = 55、次に 55 / 5) が期待されますが、Array.sum パイプラインの後、(結果としてテスト = 0) が機能しません。

4

3 に答える 3

5

もう 1 つの方法は、逆パイプ演算子 (<|) を使用して、(/) の部分的な適用が引数で正しい順序で行われるようにすることです。

let error2 y d =
    Array.map2 (fun y d -> (y - d) ** 2.0) y d
    |> Array.sum
    |> (/) <| 2.0

編集:これが明確になるかどうかを確認してください

x/y = (/) x y = y |> (/) x = x |> (/) <| y

それらはすべて同等です。パイプ演算子は次のように定義されています。

(|>) x f = f x
(<|) f x = f x

ここで、f は関数で、x は何らかの値です。逆パイプはあまり機能していないように見えますが、特定の状況で一部のコードをクリーンアップするのに役立ちます。

于 2013-09-24T17:18:13.453 に答える
1

オペレーターは、/想定どおりに動作しません。もう少し明示的にする必要があり、error2 の最後の行を次のように変更します。

fun t -> t/2.0

そして、それはすべてうまくいくはずです。

答えが 4 倍になったことが、ここでの景品でした。

編集:ここで何が起こるかを理解する/には、展開したときに何が起こるかを考えてください|>

以下はすべて同等です

a |> (/) b
((/) b) a //by removing |>
a / b     //what happens when / is reinterpreted as a function
于 2013-09-24T00:03:17.380 に答える