1

通过Scala 的 Monoid 章节中的第一个 FP 练习,在尝试使用“listMonoid”创建一个 trait 的新实现时发生编译时错误。

object MonoidTesting1 {
    trait Monoid[A] {
        def op(a1: A, a2: A): A
        def zero: A
    }

    val listMonoid = new Monoid[List[A]] {
        def op(a1: List[A], a2: List[A]) = a1 ++ a2
        val zero = Nil
    }
}


C:\Users\Kevin\Workspace\side-work\Monoid>scalac MonoidTesting.scala
MonoidTesting.scala:12: error: not found: type A
        val listMonoid = new Monoid[List[A]] {
                                         ^
MonoidTesting.scala:13: error: not found: type A
                def op(a1: List[A], a2: List[A]) = a1 ++ a2
                                ^
MonoidTesting.scala:13: error: not found: type A
                def op(a1: List[A], a2: List[A]) = a1 ++ a2
                                             ^
three errors found

如何创建 listMonoid 以使用未指定的泛型类型?

4

1 回答 1

2

List 实际上是所谓的自由幺半群。A您需要在 list 范围内显式创建Monoid

object MonoidTest {
  trait Monoid[A] {
    def op(a1: A, a2: A): A
    def zero: A
  }

  def listMonoid[A] = new Monoid[List[A]] {
    def op(a1: List[A], a2: List[A]) = a1 ++ a2
    val zero = List.empty[A]
  }
}
于 2013-10-20T22:27:09.137 回答