2014-12-30 2 views
0

현재 네트워크 라이브러리 scala에서 작업 중입니다. 내 함수는 0 인수를 "읽기"나를 좋아하지 함수 인자없는 스칼라 typeclass

object Packet { 
    trait Reader[T] { 
    def read(iterator: ByteIterator): T 
    } 

    object Reader { 
    implicit object ByteReader extends Reader[Byte] { 
     def read(iterator: ByteIterator): Boolean = iterator.getByte 
    } 
    } 
} 

class Packet { 
    import Packet._ 

    def iterator: ByteIterator 

    def read[T](implicit e: Reader[T]): T = { 
    e.read[T]() 
    } 

    def readByte(): Byte = { 
    this.read[Byte]() // <- Unspecified value parameter e 
    } 
} 

내가 답을 인터넷을 검색

가, 내가 읽은 모든 예제는 인수 기능에 대한했다 : 나는 이런 식으로 뭔가가 발생했습니다. 이게 문제 야? 이 문제를 어떻게 해결할 수 있습니까?

저는 C++ 배경에서 왔는데, 하스켈의 기초를 알고 있습니다. C++에서는 템플릿 특수화를 통해 작동하도록 할 수 있습니다. 하스켈에서는 (read :: Byte)가 작동합니다. 리플렉션을 사용하려고했으나 패킷 읽기 쓰기가 매우 낮은 수준의 작업이므로 리플렉션이 성능에 좋지 않습니다. 이 일을 할 수있는 방법이 있습니까?

+0

거기에 컴파일 오류가 표시되지 않습니다. 실제로 발생하는 '지정되지 않은'오류는 실제로 런타임 문제입니다. 이 에러는 단순히'read' 함수가 적절한 'Reader' 인터페이스를 찾을 수 없다는 것을 의미합니다. 대신에 :'readByte()'를 호출하는 사이트에서'Packet.Reader._'를 가져 오거나'Packet' 클래스에서 이것을하십시오. –

+0

@ S.R.I 제안대로 시도했지만 오류가 여전히 존재합니다. –

+0

자급 자족 코드를 게시 할 수 있습니까? –

답변

1

앞에 추가 빈 매개 변수 목록 :

def read[T]()(implicit e: Reader[T]): T = 
    e.read(iterator) 

def readByte(): Byte = 
    this.read[Byte]() // <- HURRAY IT WORKS 

통화 사이트에서 인수 목록 (()를) 제거는 작동하지만 일반적으로 구문 argumentless 통화가 referentially 투명 될 것으로 예상되기 때문에 눈살을 찌푸리게한다.