是否可以在 Idris 的 Idiom Bracket 中使用条件语句?
Is it possible to use a conditional statement in an Idiom Bracket in 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|]
我似乎无法编译它。
通过解决两个问题,我能够使它正常工作:
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 |]
像下面这样的表达式在 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|]
我似乎无法编译它。
通过解决两个问题,我能够使它正常工作:
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 |]