Я новичок в Scala, читаю библиотека синтаксического анализа и дошел до синтаксиса, который не понимаю:
def parseA[_: P] = P("a")
val Parsed.Success(value, successIndex) = parse("a", parseA(_))
Я хочу иметь возможность объединить эти строки в одну, т.е.
val Parsed.Success(value, successIndex) = parse("a", P("a"))
но это дает ошибку компиляции:
Error:(8, 61) overloaded method value P with alternatives:
[T](t: fastparse.P[T])(implicit name: sourcecode.Name, implicit ctx: fastparse.P[_])fastparse.P[T] <and>
=> fastparse.ParsingRun.type
cannot be applied to (String)
Error occurred in an application involving default arguments.
val Parsed.Success(value, successIndex) = parse(source, P("a"))
Как должна быть написана эта строка? И можете ли вы назвать синтаксические концепции, используемые для максимального увеличения моего обучения?
_: P
совпадает с (implicit ctx: P[_])
, это означает, что метод запрашивает неявный параметр типа P[_]
(подчеркивание означает, что внутренний тип не важен. См. Каковы все виды использования подчеркивания в Scala?).P("a")
вызывает метод это, который требует такой неявной области видимости, и поэтому во втором примере он не компилируется, потому что не нашел неявный параметр.
Здесь предъявляются иски к неявным, экзистенциальным типам и макросам...
Все они являются очень продвинутыми методами. Если вы только начинаете, я бы посоветовал оставить их на потом.
Имплициты очень важны и полезны, я бы начал с них, но сначала убедитесь, что вы чувствуете себя комфортно с "обычный" Scala (что бы это ни значило).
Что касается второго вопроса, я думаю, это должно сработать.
def program[_: P] = parse("a", P("a"))
val Parsed.Success(value, successIndex) = program
@ Mazerunner72 хм ... здесь происходит много всего, я бы действительно не стал заморачиваться с "рефакторинг" одной строкой, особенно если бы это работало раньше. Кроме того, fastparse
вводит свой собственный DSL, я не использовал библиотеку раньше, и, похоже, мне нужно было бы прочитать совсем немного, чтобы понять, что происходит, поэтому, если у вас возникли проблемы с библиотекой, вы можете открыть новый вопрос, явно упомянув в заголовке вы используете эту библиотеку, чтобы люди, которые ее знают, могли ее увидеть и, надеюсь, ответить на нее. Кроме того, вы можете попробовать спросить грязь вместо этого есть даже канал только для fastparse
.
Это вызвало некоторые ошибки компиляции: первая строка:
Error:(27, 37) type mismatch; found : fastparse.package.P[Unit] (which expands to) fastparse.ParsingRun[Unit] required: fastparse.P[_] => fastparse.P[?] (which expands to) fastparse.ParsingRun[_] => fastparse.ParsingRun[?] Error occurred in an application involving default arguments. def program[_: P] = parse("a", P("a"))
также вторая строка сказалаcould not find implicit value