я смог получить эту работу, заботясь о двух проблемах:
if _ then _ else _
, кажется, не распространяются на идиомы кронштейн его подвыражения
определение по умолчанию if _ then _ else _
является (конечно) ленив в своих двух ветвях, а Lazy' LazyEval
, похоже, не поднимает экземпляры.
После того, как эти две части были обработаны, я смог заставить его работать в скобке идиомы. Обратите внимание, однако, что это не сработало бы для аппликативного применения, когда взятие обеих ветвей имеет наблюдаемый эффект.
strictIf : Bool -> a -> a -> a
strictIf True t e = t
strictIf False t e = e
syntax "if" [b] "then" [t] "else" [e] = strictIf b t e
test : Maybe Float
test = let x = Just 5
y = Just 6
in [| if [| x == pure 0 |] then [|0|] else y |]
О, черт возьми! Мне понадобилось время, чтобы понять, как это работает. Это последнее выражение выглядело так, будто сначала оно не должно компилироваться, но я думаю, что понимаю, как это работает сейчас. – jedesah
Я возьму это как «не совсем». Потому что я не думаю, что Idiom Brackets стоит того. Спасибо, что нашли время ответить на мой вопрос! – jedesah