3

私は、Richard Bird による Haskell を使用した FP の紹介から Haskell の学習を開始しましたが、次のことを証明するのに行き詰まっています。

pair (f, g) . h = pair (f . h, g . h)

ペアの定義は次のとおりです。

pair :: (a -> b, a -> c) -> a -> (b, c)
pair (f, g) x = (f x, g x)

誰かが私を正しい方向に向けることができますか? 私はまだ始まったばかりだということを覚えておいてください。前もって感謝します!

4

3 に答える 3

4

1 つの方法は、すべての定義を拡張することです。f . g = \x -> f (g x)f a b = ...は と同じであることを覚えておいてくださいf a = \b -> ...

pairしたがって、と.の定義を拡張してみることができますpair (f, g) . h = pair (f . h, g . h)

于 2013-08-24T19:38:11.047 に答える
3

拡張性 を使用できます。つまり、2 つの関数が任意のxに作用するときに同じ結果を返す場合、それらは同じと見なされます (純粋な関数として - コードが異なるため、時間/空間の使用が異なる可能性があります)。

したがって、この場合、証明しようとしている等式を取得し、適切な型のx に対してそれぞれの側で動作し、両方のケースで同じ結果が得られることを示すことができます。

于 2013-08-24T19:44:26.330 に答える
2

気をつけて、スポイラー!以下で完全な証明を説明します。自分で試してみたい場合は、@nponeccop のアドバイスに従い、関数呼び出しを拡張してみてください ;)

証拠

知っています:

f . g = \x -> f (g x)

pair :: (a -> b, a -> c) -> a -> (b, c)
pair (f, g) x = (f x, g x)

また、中置合成演算子.は関数適用よりも優先順位が低いため、次のことがわかります。

  pair (f, g) . h
= (pair (f, g)) . h            -- explicit precedence
= \x -> (pair (f, g)) (h x)    -- expanding the composition operator
= \x -> (f (h x), g (h x))     -- expanding 'pair'
= \x -> ((f . h) x, (g . h) x) -- using the composition operator
= \x -> pair (f . h, g . h) x  -- back to 'pair'
= pair (f . h, g . h)

私がブーブーをしなかった場合はQED ...これが役に立てば幸いです!

于 2013-08-25T01:04:14.317 に答える