2015-03-19 2 views
0

Так что у меня дорогой метод с этой подписьюКороткого замыкания список функций возвращает /

def func(param: Int): \/[String, Int] 

Я пытаюсь перебрать список параметров, так и возвращает \/[String, List[Int]] но остановить цикл, когда метод возвращает -\/ ,

Я придумал это:

scala> def func(i: Int) = { 
    | if(i > 1) { println{"!!"} ;"error".left[Int]} 
    | else i.right[String] 
    | } 
func: (i: Int)scalaz.\/[String,Int] 

scala> val toList = (dis: scalaz.\/[String,Int]) => {dis.map(i => List(i))} 
toList: scalaz.\/[String,Int] => scalaz.\/[String,List[Int]] = <function1> 

scala> val composed = (func _) andThen toList 
composed: Int => scalaz.\/[String,List[Int]] = <function1> 

scala> (1 to 3).toList.foldLeftM(List[Int]().right[String]){(dis, i) => 
    | for{ 
    |  a <- dis 
    |  b <- composed(i) 
    | } yield a |+| b 
    | } 
<console>:17: error: no type parameters for method foldLeftM: (f: (scalaz.\/[String,List[Int]], Int) => G[scalaz.\/[String,List[Int]]])(implicit M: scalaz.Monad[G])G[scalaz.\/[String,List[Int]]] exist so that it can be applied to arguments ((scalaz.\/[String,List[Int]], Int) => scalaz.\/[String,List[Int]]) 
--- because --- 
argument expression's type is not compatible with formal parameter type; 
found : (scalaz.\/[String,List[Int]], Int) => scalaz.\/[String,List[Int]] 
required: (scalaz.\/[String,List[Int]], Int) => ?G[scalaz.\/[String,List[Int]]] 

       (1 to 2).toList.foldLeftM(List[Int]().right[String]){(dis, i) => 
            ^
<console>:17: error: type mismatch; 
found : (scalaz.\/[String,List[Int]], Int) => scalaz.\/[String,List[Int]] 
required: (scalaz.\/[String,List[Int]], Int) => G[scalaz.\/[String,List[Int]]] 
       (1 to 2).toList.foldLeftM(List[Int]().right[String]){(dis, i) => 
                      ^

Что за G[_] здесь и то, что правильный тип результата в foldLeftM?

ответ

0

решаемые отметили две ошибки я сделал:

  1. непонятого о типе первоначальной/переносится значение, оно должно быть List[Int] вместо \/
  2. приходится явного параметра типа объявить о foldLeftM

    scala> def func(i: Int) = { 
    | if(i > 1) { println{"!!"} ;"error".left[Int]} 
    | else i.right[String] 
    | } 
    func: (i: Int)scalaz.\/[String,Int] 
    
    scala> val toList = (dis: scalaz.\/[String,Int]) => {dis.map(i => List(i))} 
    toList: scalaz.\/[String,Int] => scalaz.\/[String,List[Int]] = <function1> 
    
    scala> val composed = (func _) andThen toList 
    composed: Int => scalaz.\/[String,List[Int]] = <function1> 
    
    scala> val f = (dis: List[Int], i: Int) => composed(i).map(r => dis |+| r) 
    f: (List[Int], Int) => scalaz.\/[String,List[Int]] = <function2> 
    
    scala> (1 to 4).toList.foldLeftM[({type l[a] = String \/ a})#l, List[Int]](List[Int]())(f) 
    !! 
    res16: scalaz.\/[String,List[Int]] = -\/(error) 
    
Смежные вопросы