Карта при сбое проверки Scalaz - PullRequest
18 голосов
/ 22 сентября 2011
import scalaz._
import Scalaz._

"abc".parseInt

Это вернет Validation[NumberFormatException, Int]. Есть ли способ применить функцию на стороне сбоя (например, toString), чтобы получить Validation[String, Int]?

Ответы [ 2 ]

19 голосов
/ 22 сентября 2011

Существует пара методов <-: и :->, определенных на MAB[M[_,_], A, B], которые отображают на левой и правой стороне любого M[A, B], пока существует Bifunctor[M]. Validation оказывается бифунктором, так что вы можете сделать это:

((_:NumberFormatException).toString) <-: "123".parseInt

Вывод типа Scala обычно происходит слева направо, поэтому на самом деле он короче:

"123".parseInt.<-:(_.toString)

И требует меньше комментариев.

11 голосов
/ 22 сентября 2011

В FailProjection есть функтор. Так что вы могли бы сделать

v.fail.map(f).validation

(невозможно набрать как FailProjection, проверка для выхода из него)

С другой стороны

v.fold(f(_).failure, _.success)

Оба немного многословны. Может быть, кто-то более знакомый со скалазом может придумать что-нибудь получше

...