斯卡拉:组成法律反例

时间:2017-06-25 19:38:43

标签: scala functional-programming functor

我使用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)。我们能有一个不遵守这条规则的例子吗?

由于

1 个答案:

答案 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)