проверка скаляза и списка монада - PullRequest
6 голосов
/ 10 августа 2011

Я пытаюсь придумать что-то похожее на следующее:

val s: Validation[String, Int] = 1.success
def s2(i: Int): Validation[String, Int] = i.success

val result = for {
  i <- s
  j <- List(1, 2)
  k <- s2(j)
} yield "fine";

Приведенный выше код не компилируется, и я понимаю, что синтаксически это не имеет смысла.

Япытаясь выполнить список проверок монадическим способом.Как мне этого добиться?

Ответы [ 2 ]

8 голосов
/ 10 августа 2011

Если у вас есть список проверок A, вы можете превратить его в проверку списков A, используя sequence:

List(1, 2).map(s2).sequence[({type l[a]=Validation[String, a]})#l, Int] 

(если я правильно понял вопрос),Итак, вы получите

val result = for {
  i <- s
  k <- List(1, 2).map(s2).sequence[({type l[a]=Validation[String, a]})#l, Int] 
} yield "fine"
4 голосов
/ 11 августа 2011

Вы, кажется, используете проверку для побочного эффекта.Это не то, для чего он нужен.Вы используете возвращаемые значения в функциональном программировании.

Валидация для понимания продолжается в случае успеха, но прерывается при ошибке и возвращает ошибку.

...