Scala:从特征实例化时使用def或val?

时间:2018-11-24 05:44:33

标签: scala

我正在阅读Chiusano和Bjarnason的 Scala中的功能编程

在第10章中,他们定义了Monoid特质:

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

以下是该特征的两个实例:

1)String Monoid:

val stringMonoid = new Monoid[String] {
    def op(a1: String, a2: String) = a1 + a2
    val zero = ""
}

2)List Monoid:

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

我的问题是,为什么我们在val的情况下使用stringMonoid,而在def的情况下使用listMonoid

1 个答案:

答案 0 :(得分:5)

<android.support.v7.widget.CardView android:layout_width="64dp" android:layout_height="64dp" android:layout_marginBottom="24dp" android:layout_marginStart="24dp" android:layout_marginTop="24dp" app:cardBackgroundColor="@android:color/white" app:cardCornerRadius="16dp" app:cardElevation="2dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/textView10" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="2" android:text="TextView" /> <TextView android:id="@+id/textView11" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:background="@drawable/rounded.xml" android:gravity="center_vertical|center_horizontal" android:text="Bids" android:textAllCaps="true" android:textColor="@android:color/white" android:textStyle="bold" /> </LinearLayout> </android.support.v7.widget.CardView> 是字符串类型stringMonoid

new Monoid[String]是通用类型listMonoid。要传递此通用类型new Monoid[List[A]],必须将其声明为A

def

修改

要发表评论:

如果您仍然希望将def listMonoid[A] = new Monoid[List[A]] 用作val,则定义其中要包含的列表。

listMonoid