チュートリアルでこの質問を受けましたが、どうすればよいかわかりません。
filter p . map f = map g . filter h
が常に成り立つようにするには、p と f に関して g と h をどのように定義する必要がありますか?
正しい方向へのポインタは大歓迎です。
チュートリアルでこの質問を受けましたが、どうすればよいかわかりません。
filter p . map f = map g . filter h
が常に成り立つようにするには、p と f に関して g と h をどのように定義する必要がありますか?
正しい方向へのポインタは大歓迎です。
f :: a -> b
とであることは明らかですp :: b -> Bool
。f
とについて他の仮定を立てることはできないため、次のg
ように定義する必要があります。
h = p . f
g = f
今h :: a -> Bool
とg :: a -> b
。
タイプについて考えてみましょう。
f :: a -> b
g :: a -> b
p :: b -> Bool
h :: a -> Bool
これを確認する別の方法:
map g (filter h A)
セットです{g(a) : with h(a) is true and a is elt from A}
filter p (map f A)
セットです{f(a) : with p(f(a) is true and a is elt from A}
これらのセットを等しくするには、 と を選択する必要がありf = g
ますh(a) = p(f(a))
。