我使用Scala语言学习函数式编程。我已经阅读了有关仿函数有关2法则的仿函数的教程:
1. identity law: functor.map(x => x) ≡ functor
2. Composition law: functor.map(x => f(g(x))) ≡ functor.map(g).map(f)
我不了解组成法。我觉得所有函数都有这个属性:f(g(x))= functor.map(g).map(f)。我们能有一个不遵守这条规则的例子吗?
由于
答案 0 :(得分:1)
以下是Set
违反第二个仿函数法的例子(因此不是仿函数,虽然起初可能看起来像一个):
case class Foo(s: String) {
override def equals(obj: scala.Any): Boolean = obj match {
case Foo(t) => s.toUpperCase == t.toUpperCase
case _ => false
}
}
val toFoo = (s: String) => Foo(s)
val fromFoo = (foo: Foo) => foo.s
val set = Set("something", "SOMETHING")
set.map(toFoo).map(fromFoo) // Set(something)
set.map(x => fromFoo(toFoo(x))) // Set(something, SOMETHING)