伊德里斯 - 懒惰的评价问题

问题描述:

考虑此程序:伊德里斯 - 懒惰的评价问题

module test 

import Effects 
import Effect.StdIO 

(>>==) : Maybe a -> Lazy (a -> Maybe b) -> Maybe b 
(>>==) Nothing (Delay map) = Nothing 
(>>==) (Just x) (Delay map) = map x 

nothing : String -> Eff (Maybe String) [STDIO] 
nothing s = do 
    putStrLn s 
    pure Nothing 

func : Maybe String -> String -> Maybe String 
func Nothing _ = Nothing 
func (Just s) t = Just (s ++ t) 

test : Eff() [STDIO] 
test = do 
    let m = !(nothing "a") >>== (func !(nothing "b")) 
    putStrLn "end" 

main : IO() 
main = run test 

>>==右侧声明懒惰和!(nothing "a")返回Nothing,我预料的>>==右边不会进行评估。

但实际上它得到的评价,我不明白为什么...

更广泛地说,我试图串联Eff计算返回也许并停止执行,当我拿到第一Nothing

Desugar!符号。

test = do 
    x <- nothing "a" 
    y <- nothing "b" 
    let m = x >>== (func y) 
    putStrLn "end" 

显然“一”,“b”和“结束”将全部被打印,但func可能无法进行评价。

我认为您需要定义>>==以对(某些)Eff值起作用,而不是直接对Maybe s执行操作。

HTH

+0

我其实想的是,计算后'没有“一”',使'“B”'从不打印停止。我想这不会发生,因为'do'符号在错误的背景下工作,即'Eff'而不是'Maybe'。在Haskell中,我将使用'MaybeT' monad变换器来解决这个问题,在Idris中有没有类似的东西?依赖类型是否允许我做更清洁的事情? – marcosh

+0

添加'EXCEPTION()'效果。有'nothing'调用raise()',已经有一个基于Maybe定义的处理程序,不管你提出什么都可以工作。 –