2014-02-11 36 views
3

可以說我有功能轉換單子

(>>*=) :: (Show e') => Either e' a -> (a -> Either e b) -> Either e b 

這將在乾淨的流線型功能不同類型的錯誤。我對此很高興。

難道有可能是功能<*-,會做類似的工作insted的<-關鍵字的,它不會顯得太令人不安?

+1

如果它的左參數是「Left」值,那麼'(>> * =)'會給你什麼? –

回答

3

這是不可能寫的功能,你可以使用,而不是<-在符號。原因是在<-的左邊,有一個模式,但功能取值。但是,也許你可以寫一個函數

foo :: (Show e') => Either e' a -> Either e a 

該轉換的錯誤信息,然後使用它是這樣的:

do x <- foo $ code that creates e1 errors 
    y <- foo $ code that creates e2 errors 

雖然這不是因爲<*-你問的好,它應該允許你使用符號。

+0

「這是不可能寫一個函數,你可以使用,而不是< - 在符號中」是的,請參閱RebindableSyntax:http://www.haskell.org/ghc/docs/7.4.1/html/ users_guide/syntax-extns.html – user2407038

+0

@ user2407038感謝您的鏈接 – user978734

+2

@ user2407038,不確定。可重新綁定語法將允許從問題中解除'<-' to the '>> * ='的所有用法。但我認爲這個問題是關於有時使用'<-'並且有時使用'<* - '。 – Toxaris

5

嗯,我的回答和Toxaris對foo :: Either e a -> Either e' a功能的建議是一樣的,但我會盡量多激勵一下。

foo這樣的函數就是我們所說的monad morphism:從一個monad到另一monad的自然轉換。您可以非正式地將其視爲一個函數,它將源monad中的任何操作(不考慮結果類型)發送到目標monad中的「明智」對應方。 (「明智的」一點是它變得猥瑣的地方,所以我會跳過那些細節...)

Monad態射是一個比你的建議>>*=函數更基本的概念,用於處理Haskell中的這種情況。你>>*=是乖巧的,如果它等同於以下:

(>>*=) :: Monad m => n a -> (a -> m b) -> m b 
na >>*= k = morph na >>= k 
    where 
     -- Must be a monad morphism: 
     morph :: n a -> m a 
     morph = ... 

所以,最好到你的因素進行>>*=>>=和具體案件的單子態射。如果您閱讀上面的鏈接和the tutorial for the mmorph library,您會看到使用用戶提供的monad態射來編輯monad變壓器堆棧的通用實用函數示例,例如,使用單態射線morph :: Error e a -> Error e' aStateT s (ErrorT e IO) a轉換爲StateT s (ErrorT e' IO) a