Неявное представление доступно из fastparse.P [Any] => fastparse.P [Unit] - PullRequest
0 голосов
/ 05 августа 2020

Я прорабатываю учебник / объяснение fastparse и получаю сообщение об ошибке

error: No implicit view available from fastparse.P[Any] => fastparse.P[Unit]

для примера последовательности .

Я использую sbt 1.3.8 и scala 2.13.1. Определенная версия для fastparse - 2.2.2.

scala> import fastparse._
import fastparse._

scala> def ab[_:P] = P("a" ~ "b")
                           ^
       error: No implicit view available from fastparse.P[Any] => fastparse.P[Unit].

scala> def a[_:P] = P("a")
a: [_](implicit evidence$1: fastparse.P[Any])fastparse.package.P[Unit]

scala> def b[_:P] = P("b")
b: [_](implicit evidence$1: fastparse.P[Any])fastparse.package.P[Unit]

scala> def ab[_:P] = P(a ~ b)
                         ^
       error: No implicit view available from fastparse.package.P[Any] => fastparse.package.P[Unit].

scala> def ab[_:P] = P("a" | "b")
ab: [_](implicit evidence$1: fastparse.P[Any])fastparse.package.P[Unit]

scala> fastparse.parse("a", ab(_))
res2: fastparse.Parsed[Unit] = Parsed.Success((), 1)

Что означает эта ошибка и что я сделал не так / как завершить этот шаг руководства без ошибок?

Ответы [ 2 ]

3 голосов
/ 05 августа 2020

Вам необходимо указать, как обрабатывать пробелы , например, следующее не работает:

import fastparse._
import fastparse.NoWhitespace._

def ab[_:P] = P("a" ~ "b")
assert(parse("a      b", ab(_)).isSuccess)

, потому что "a b" содержит пробелы, а следующие проходит

import fastparse._
import fastparse.SingleLineWhitespace._

def ab[_:P] = P("a" ~ "b")
assert(parse("a      b", ab(_)).isSuccess)

потому что import fastparse.SingleLineWhitespace._ предоставляет потребителя пробела. Если мы посмотрим на определение ~

def ~[V, R](other:  P[V])
           (implicit s: Implicits.Sequencer[T, V, R],
            whitespace: P[Any] => P[Unit],
            ctx: P[_]): P[R] = macro MacroImpls.parsedSequence[T, V, R]

, мы увидим требование implicit whitespace: P[Any] => P[Unit], которое объясняет ошибку No implicit view available. Импорт пробелов предоставляет эту возможность, например

object NoWhitespace {
  implicit object noWhitespaceImplicit extends (ParsingRun[_] => ParsingRun[Unit]){
    def apply(ctx: ParsingRun[_]) = ctx.freshSuccessUnit()
  }
}

, где мы видим ParsingRun[_] => ParsingRun[Unit] неявную функцию.

2 голосов
/ 05 августа 2020

Вы пропустили еще один импорт

import NoWhitespace._

https://scastie.scala-lang.org/qCKZEnRHS7eOhjpVjtWNIQ

...