Карта сбоя проверки Scalaz

import scalaz._
import Scalaz._

"abc".parseInt

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


person huynhjl    schedule 22.09.2011    source источник


Ответы (2)


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

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

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

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

И требует меньше аннотаций.

person Apocalisp    schedule 22.09.2011
comment
Хороший. Интересно, может ли в MAB быть полезным следующее: def bimap[C,D](первое: A => C = identity[A] _, второе: B => D = identity[B] _)(неявное b: бифунктор [M]): M[C, D] = b.bimap(значение, первое, второе). Итак, мы получаем 123.parseInt.bimap(_.toString) - person Didier Dupont; 23.09.2011
comment
Это было бы круто. Отправьте запрос на включение. - person Apocalisp; 23.09.2011

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

v.fail.map(f).validation

(не удалось ввести как FailProjection, проверка, чтобы выйти из него)

Альтернативно

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

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

person Didier Dupont    schedule 22.09.2011
comment
не могу заставить работать f andthen Failure: "123".parseInt.fold(_.toString andThen Failure) печатает type mismatch. Другой работает нормально. - person huynhjl; 22.09.2011
comment
@huynhjl: fold выполняет две функции: первую для случая ошибки, вторую для случая успеха. v.fold(_.toString.fail, _.success) работает - person Arjan Blokzijl; 22.09.2011
comment
Но аргументы fold имеют значения по умолчанию (идентификаторы), не так ли? - person Didier Dupont; 22.09.2011
comment
@Апокалисп. Спасибо. Теперь мне нужно найти, где определяется отказ :-) - person Didier Dupont; 22.09.2011
comment
foldArguments имеют значения по умолчанию: Хорошо, здесь не то, что нужно, идентичность — это не то, что нам нужно. - person Didier Dupont; 22.09.2011
comment
_.failure и _.success определены в Identity, как и большинство других вещей, применимых к типам вида *. - person Apocalisp; 22.09.2011