この場がいいのかどうか分かりませんが、もし分かれば教えてください。

Wadlerの"Theorems for free"に、
r: ∀X. List(X) -> List(X) ならば a* o r-A = r-B o a*
  ここで、a: A -> B, a*: List(A) -> List(B),
 r-A: List(A) -> List(A), r-B: List(B) -> List(B)
という定理が出てきます。

しかし、ここのrやaをたとえば
 r = { ["a", "b"] |-> ["a", "b", "b"],
[1, 2] |-> [2, 1],
........... }
a = { "a" |-> 1, "
"b" |-> 2,
............}
のようにとった場合、
 a* (r-Char(["a", "b"]) = a* (["a", "b", "b"])
= [1, 2, 2]
r-Int (a* (["a", "b"]) = r-Int ([1, 2])
= [2, 1]
となってしまい、明らかに
この定理は成り立たないと思うのですが、どこか誤解があるでしょうか?