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

时间:2017-10-19 07:47:58

标签: monads lazy-evaluation idris

考虑这个程序:

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,我预计>>==的右侧不会被评估。< / p>

但实际上它确实得到了评​​估,我无法理解为什么......

更广泛地说,我正在尝试连接可能返回的Eff计算,并在我获得第一个Nothing

时停止执行

1 个答案:

答案 0 :(得分:0)

去除了Desugar!符号

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

显然&#34; a&#34;,&#34; b&#34;和&#34;结束&#34;将全部打印,但func可能无法评估。

我认为您需要定义>>==来对某些Eff值进行操作,而不是直接在Maybe上进行操作。

HTH