Định nghĩa của tùy chọn monoid của scalaz là như sau:Tại sao việc thực hiện Monoid của Option cho phép đánh giá hàm f2 hai lần?
implicit def optionMonoid[A: Semigroup]: Monoid[Option[A]] = new Monoid[Option[A]] {
def append(f1: Option[A], f2: => Option[A]) = (f1, f2) match {
case (Some(a1), Some(a2)) => Some(Semigroup[A].append(a1, a2))
case (Some(a1), None) => f1
case (None, Some(a2)) => f2
case (None, None) => None
}
def zero: Option[A] = None
}
f2
là một đường chuyền theo tên param có nghĩa là mỗi cuộc gọi sẽ đánh giá sự biểu hiện. Tại sao nó lại được đánh giá lại khi nó vừa được đánh giá trong khớp mẫu? Trả lại Some(a2)
phải là kết quả tương tự và biểu thức f2
có thể rất tốn kém.
Tôi có thiếu gì đó không?
Có lẽ một sự chuyển giao từ suy nghĩ của Haskell có định nghĩa tương đương rẻ? –
Bạn đã thử nghiệm điều này? Đặt một số println bên trong nó và kiểm tra. – Felix
Có, tôi đã kiểm tra nó và println bị nhấn hai lần. Tôi sẽ sửa chữa nó và gửi một yêu cầu kéo đến scalaz tôi đoán. – coltfred