考虑这个程序:
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
答案 0 :(得分:0)
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