2017-10-19 103 views
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

回答

0

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定義的處理程序,不管你提出什麼都可以工作。 –