我在教程中被提出过这个问题,我真的不知道该怎么做。
必须如何根据 p 和 f 定义 g 和 h 以确保
filter p . map f = map g . filter h
始终成立?
任何指向正确方向的指针将不胜感激。
我在教程中被提出过这个问题,我真的不知道该怎么做。
必须如何根据 p 和 f 定义 g 和 h 以确保
filter p . map f = map g . filter 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))
。