type ErrorOrValue = Either InterpreterError Value
evaluateExpression :: [Value] -> IR.Expression -> ErrorOrValue
evaluateExpression as (IR.Application l r)
| Left _ <- arg = arg
| Right (Partial ac b as) <- f = foo as f arg
| Right _ <- f = Left NonFunctionApplication
| otherwise = f
where
f = evaluateExpression as l >>= forceValue
arg = evaluateExpression as r
Мне нужно позвонить foo
с f
и arg
убедившись, что они не являются Left
.Снизить шаблон
Могу ли я уменьшить соответствие шаблонов и вместо этого использовать привязки и другие операции с монадами?
Короткий ответ: да, есть монада. –