2013-12-14 34 views
1
data Error a = OK a | Error String 
instance Monad Error where 
    return = OK 

我應該如何在這種情況下定義綁定? >>= : Error a -> (a->error b) -> error b這是這種情況下的函數綁定的類型,我希望它是正確的。如何定義錯誤monad

OK a >>= f  =    (don't know where to begin need some help) 
Error err >>=f =    (in this case can i just return error like = Error err) 

我也想知道是否有人可以解釋爲什麼這些seq的使用有問題。 你可以找到他們的幻燈片(頁)序列的10 使用 http://fileadmin.cs.lth.se/cs/Education/EDAN40/lectures/Parallelism.pdf hittendInside XY = someFunc(X「序列」 Y)這是爲什麼問題forexamble是不是因爲SEQ不會返回X只會評估,並會只返回y。 這是另外兩個考試中的情況嗎?

+0

您需要始終將您的類型大寫爲「錯誤b」,而不是「錯誤b」。爲什麼不問你的'seq'問題是一個單獨的問題? –

回答

1

對於您的OK的情況,您有一個a和一個函數(a -> Error b),並且需要返回值類型Error b。你可以簡單地套用你的函數fOK的價值a:你會如何想的功能的管道

OK a >>= f = f a 
Error err >>= f = Error err 
+0

你知道地圖(:)做什麼嗎? – user2975699

9

認爲,如果沒有發生錯誤的工作

---->f---->g---->h----> 
    |  |  | 
    V  V  V 
    Err Err Err 

,數據應該只是是通過

OK x---->remove OK---->f---->remove OK---->g---->remove OK---->h----> 

直射門被

0這可以實現
OK x >>= f = f x 

如果你打一個錯誤的任何點,計算應停止

OK x---->remove OK---->f---->Error (Stop!) 

這可以通過

Error message >>= f = Error message 

順便來實現,你沒有寫這個,它已經以名稱「任一」存在

data Either a b = Left a | Right b 

monad設置爲「R ight「傳遞數據(獲取它 - 」Right「意味着」正確「),並且Left停止數據(即它是」錯誤「)。如果你不想要消息,使用「也許」。

請注意,這很像Java中的異常。