是否可以在Idris的成语括号中使用条件语句?

时间:2015-01-06 21:07:50

标签: syntactic-sugar applicative idris

以下表达式在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|]

我似乎无法将其编译。

1 个答案:

答案 0 :(得分:3)

我能够通过处理两个问题来解决这个问题:

  1. if _ then _ else _似乎没有将成语括号传播到其子表达式

  2. if _ then _ else _的默认定义(当然)在其两个分支中是懒惰的,Lazy' LazyEval似乎无法提升实例。

  3. 一旦解决了这两个问题,我就可以在成语支架中使用它。但是请注意,对于两个分支都具有可观察效果的应用程序,这不会起作用。

    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 |]