以下表达式在Idris中完全有效:
let x = Just 5 in let y = Just 6 in [|x / y|]
有人可以写下面的表达式吗?
let x = Just 5 in let y = Just 6 in [| if x == 0 then 0 else y|]
我似乎无法将其编译。
答案 0 :(得分:3)
我能够通过处理两个问题来解决这个问题:
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 |]