2010-04-30 40 views
5

tôi cố gắng tìm hiểu tại sao các cuộc gọi in scalaz.ListW.<^> làm việctham số ngầm trong Scalaz

def <^>[B: Zero](f: NonEmptyList[A] => B): B = value match { 
    case Nil => ∅ 
    case h :: t => f(Scalaz.nel(h, t)) 
} 

lý thuyết tối thiểu của tôi là:

trait X[T]{ 
    def y : T 
} 

object X{ 
    implicit object IntX extends X[Int]{ 
    def y = 42 
    } 
    implicit object StringX extends X[String]{ 
    def y = "y" 
    } 
} 
trait Xs{ 
    def ys[T](implicit x : X[T]) = x.y 
} 

class A extends Xs{ 
    def z[B](implicit x : X[B]) : B = ys //the call ∅ 
} 

sản xuất nào:

import X._ 

scala> new A().z[Int] 
res0: Int = 42 

scala> new A().z[String] 
res1: String = y 

là hợp lệ này? Tôi có thể đạt được kết quả tương tự với ít bước hơn không?

Trả lời

1

Đó là tất cả. Bạn có thể loại bỏ Xs và giữ lại bản chất của ví dụ:

object A{ 
    def ys[T](implicit x : X[T]) = x.y 
} 
A.ys 

Khía cạnh thú vị khác của việc sử dụng trong Scalaz là kiểu lập luận để được suy ra từ các loại dự kiến ​​B của biểu thức.

Gần đây tôi đã phải thay đổi Zero thành bất biến trong thông số loại của nó. Điều này thực sự phá vỡ khả năng suy luận của loại đối số này trong một số trường hợp; bạn có thể thấy điều này trong số example này. Có một số vé mở có liên quan mà hy vọng sẽ được giải quyết bằng những thay đổi trên branch này.

Các vấn đề liên quan