3

像下面这样的表达式在 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|]

我似乎无法编译它。

4

1 回答 1

4

我能够通过解决两个问题来完成这项工作:

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

  2. 的默认定义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 |]
于 2015-01-07T05:13:47.430 回答