3
考慮此程序:伊德里斯 - 懶惰的評價問題
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
我其實想的是,計算後'沒有「一」',使'「B」'從不打印停止。我想這不會發生,因爲'do'符號在錯誤的背景下工作,即'Eff'而不是'Maybe'。在Haskell中,我將使用'MaybeT' monad變換器來解決這個問題,在Idris中有沒有類似的東西?依賴類型是否允許我做更清潔的事情? – marcosh
添加'EXCEPTION()'效果。有'nothing'調用raise()',已經有一個基於Maybe定義的處理程序,不管你提出什麼都可以工作。 –