チュートリアルでこの質問を受けましたが、どうすればよいかわかりません。
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))。