Scala частично примененный вывод конструктора типа - PullRequest
0 голосов
/ 24 декабря 2010

Я использую scala-2.8.1 и scalaz-5.0 . Может кто-нибудь объяснить, почему PartialApply1Of2 может быть выведено в одном случае, но не в другом?

scala> 1.success[String] <|*|> "Bah".fail[Int]
res1: scalaz.Validation[String,(Int, Int)] = Failure(Bah)

Это сработало, хотя (, как было задано ранее !), Метод <|*|> находится на MA, который имеет один параметр типа, а не два (как Validation). Я не могу получить Unicode, работающий в моем IDEA REPL, вот так:

object testy {
  def main(args: Array[String]) {
    import scalaz._
    import Scalaz._
    val ps = NonEmptyList(1.success[String], "Bah".fail[Int])

    val res = ps.∘∘((_ : Int) % 2 == 0) //DOES NOT COMPILE
    println(res)
  }
}

Я могу предоставить конкретный тип вызова, и все хорошо. Почему scalac не может сделать вывод об этом?

ps.∘∘[PartialApply1Of2[Validation, String]#Apply, Int, Boolean]((_ : Int) % 2 == 0)

В моем REPL это фактически вызывает скалярную ошибку, а не разумное сообщение об ошибке

1 Ответ

2 голосов
/ 26 декабря 2010

В первом случае подразумевается неявное представление ValidationMA и выводится аргумент типа Int:

Scalaz.ValidationMA(1.success[String]).<|*|>[Int]("Bah".fail[Int])

Во втором случае аргумент типа для метода ∘∘ не может быть выведен, пока не решен # 2712 .

Я подозреваю, что скалярная внутренняя ошибка, с которой вы столкнулись, связана с # 2741 / # 4079 . Если это так, вы можете переписать его с помощью типа лямбда, чтобы обойти ошибку.

ps.∘∘[({type X[a]=Validation[String, a]})#X, Int, Boolean]((_ : Int) % 2 == 0)

Я рекомендую использовать этот синтаксис вместо PartialApplyNofM во всех случаях, так как я считаю его более читабельным. В последней сборке IntelliJ вы даже можете включить свертывание кода (Настройки, Стиль кода, Scala, Сворачивание, Тип Lambas), чтобы скрыть некоторые синтаксические помехи .

...