(Это ответ на вопрос «По предложению @Daniel Wagner, я расширяю обновление fmap g p
:»)
Верна ли последняя замена?
Невозможно ответить, потому что шаги до этого некорректны.
Есть несколько проблем с вашим расширением, указывающих на то, что вы неаккуратны при записи, что привело к ошибкам. Также могут быть концептуальные проблемы.
Например, когда вы вставили three = P ...
в parse three "abc"
, вы не поставили круглые скобки вокруг P ...
, ведя к этой строке:
parse P (parse (P ...)) <*> item <*> item "abc"
Скорее всего, это синтаксически неверно, так как он будет проанализирован как
(parse P (parse (P ...))) <*> item <*> (item "abc")
Хотя вы, вероятно, имели в виду:
parse ((P ...) <*> item <*> item) "abc"
Если вы думаете, ну, я просто делаю это, чтобы сделать проще написать, а потом проверить: эта синтаксическая ошибка также привела к ошибочной работе над частью parse P (parse (P ...))
независимо от <*> item <*> item "abc"
, что было серьезной ошибкой и сделало большую часть всего, что после этого не имеет значения.
Другое дело так:
Here, inp="abc", (\inp -> [(g,inp)]), inp = [ (f x y z =(x,z), "abc" )]
Эта строка вообще не имеет смысла. Так как вы просто расширяете three
, нельзя сказать, что inp
- это что-то. Рассмотрим (\x -> x)
. x
здесь просто для установления sh отношения, что результат совпадает с аргументом и не имеет никакого конкретного значения. Это то, что подразумевается под переменной bound .
(И я даже не знаю, о чем вы говорите, когда говорите (\inp -> [(g,inp)]), inp = [ (f x y z =(x,z), "abc" )]
. Может быть, вы можете уточнить? )
Это также означает, что следующее не имеет смысла
(\inp -> case parse item inp of [] -> []; [(v, out)] -> [(g v, out)]))<*> item <*> item “abc”
={substitute inp for "abc"}
case parse item "abc" of [] -> []; [(v, out)] -> [(g v, out)]<*> item <*> item
Здесь есть несколько проблем. Начнем с того, что в первой строке есть дополнительная близкая скобка, что затрудняет понимание того, что вы имеете в виду. Если мы проигнорируем это, то раньше у вас было (\inp ->) <*> item ...
, но потом вы не ставили скобки вокруг выражения case
, делая <*>
.
Также кажется, что вы хотите сделать бета-версию. сокращение здесь. Бета-редукция всегда имеет форму (\v -> E) a
, в которой лямбда-выражение непосредственно применяется к аргументу. Вы не можете просто сказать случайным образом, что «v
равно a
» и прыгать в выражениях.
Например, если у нас есть f (\x -> x + 1) 3
, правильно ли уменьшать это значение до f 4
? Нет, потому что лямбда не применяется к 3
.
Это означает, что даже если первая половина верна, вторая половина того, что вы написали, основана на бессмысленном шаге и не имеет значения.
Я бы очень хотел рассказать вам, как исправить ваши сокращения, но мне жаль говорить, что я думаю, что то, что вы написали, уже не подлежит восстановлению. Если вы хотите получить правильную трассировку сокращения, будьте более внимательны с синтаксисом и допустимостью каждого шага и делайте все заново с нуля.
В качестве справки, есть несколько вещей, которые вы должны проверить посмотрите, что пошло не так:
- Каждый шаг должен быть синтаксически действительным. Отсутствие несвязанных переменных, отсутствие пропущенных символов и т. Д. c.
- Если проверка типов исходного выражения выполняется, то каждый шаг также должен проверять тип и иметь одинаковый тип.