나는이 위대한 기사를 dependency injection in scala with Reader monad에 대해 읽었습니다.`Reader` 모나드와`Try`를 다루는 방법 은요?
원래 예제가 정상적으로 작동하지만, UserRepository.get/find
의 반환 유형을 약간 변경했습니다. 그것은 User
이었지만, 나는 Try[User]
으로 바 꾸었습니다.
그런 다음 코드는 컴파일되지 않을 것입니다. 여러 번 시도했지만 여전히 행운이 없습니다.
import scala.util.Try
import scalaz.Reader
case class User(email: String, supervisorId: Int, firstName: String, lastName: String)
trait UserRepository {
def get(id: Int): Try[User]
def find(username: String): Try[User]
}
trait Users {
def getUser(id: Int) = Reader((userRepository: UserRepository) =>
userRepository.get(id)
)
def findUser(username: String) = Reader((userRepository: UserRepository) =>
userRepository.find(username)
)
}
object UserInfo extends Users {
def userEmail(id: Int) = {
getUser(id) map (ut => ut.map(_.email))
}
def userInfo(username: String) =
for {
userTry <- findUser(username)
user <- userTry // !!!!!!!! compilation error
bossTry <- getUser(user.supervisorId)
boss <- bossTry // !!!!!!!! compilation error
} yield Map(
"fullName" -> s"${user.firstName} ${user.lastName}",
"email" -> s"${user.email}",
"boss" -> s"${boss.firstName} ${boss.lastName}"
)
}
컴파일 오류는 다음과 같습니다
Error:(34, 12) type mismatch;
found : scala.util.Try[Nothing]
required: scalaz.Kleisli[scalaz.Id.Id,?,?]
user <- userTry
^
및
Error:(36, 12) type mismatch;
found : scala.util.Try[scala.collection.immutable.Map[String,String]]
required: scalaz.Kleisli[scalaz.Id.Id,?,?]
boss <- bossTry
^
내가
Kleisli.flatMap
의 문서 (
findUser
의 반환 형식과
getUser
을
Kleisli
입니다)를 읽어
, 그것은 매개 변수 유형을 필요로 is :
B => Kleisli[M, A, C]
Try
은 Kleisli
이 아니기 때문에 이러한 오류가 있습니다.
어떻게 처리해야할지 모르겠다. scala.util.Try
을 여기에서 사용할 수 있습니까? KLeisli
유형으로 변환하려면 어떻게해야하나요? 이 예제를 어떻게 만들 수 있습니까?