伊德里斯 - 懒惰的评价问题
问题描述:
考虑此程序:伊德里斯 - 懒惰的评价问题
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
我其实想的是,计算后'没有“一”',使'“B”'从不打印停止。我想这不会发生,因为'do'符号在错误的背景下工作,即'Eff'而不是'Maybe'。在Haskell中,我将使用'MaybeT' monad变换器来解决这个问题,在Idris中有没有类似的东西?依赖类型是否允许我做更清洁的事情? – marcosh
添加'EXCEPTION()'效果。有'nothing'调用raise()',已经有一个基于Maybe定义的处理程序,不管你提出什么都可以工作。 –