可以說我有功能轉換單子
(>>*=) :: (Show e') => Either e' a -> (a -> Either e b) -> Either e b
這將在乾淨的流線型功能不同類型的錯誤。我對此很高興。
但
難道有可能是功能<*-
,會做類似的工作insted的<-
關鍵字的,它不會顯得太令人不安?
可以說我有功能轉換單子
(>>*=) :: (Show e') => Either e' a -> (a -> Either e b) -> Either e b
這將在乾淨的流線型功能不同類型的錯誤。我對此很高興。
但
難道有可能是功能<*-
,會做類似的工作insted的<-
關鍵字的,它不會顯得太令人不安?
這是不可能寫的功能,你可以使用,而不是<-
在符號。原因是在<-
的左邊,有一個模式,但功能取值。但是,也許你可以寫一個函數
foo :: (Show e') => Either e' a -> Either e a
該轉換的錯誤信息,然後使用它是這樣的:
do x <- foo $ code that creates e1 errors
y <- foo $ code that creates e2 errors
雖然這不是因爲<*-
你問的好,它應該允許你使用符號。
「這是不可能寫一個函數,你可以使用,而不是< - 在符號中」是的,請參閱RebindableSyntax:http://www.haskell.org/ghc/docs/7.4.1/html/ users_guide/syntax-extns.html – user2407038
@ user2407038感謝您的鏈接 – user978734
@ user2407038,不確定。可重新綁定語法將允許從問題中解除'<-' to the '>> * ='的所有用法。但我認爲這個問題是關於有時使用'<-'並且有時使用'<* - '。 – Toxaris
嗯,我的回答和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' a
將StateT s (ErrorT e IO) a
轉換爲StateT s (ErrorT e' IO) a
。
如果它的左參數是「Left」值,那麼'(>> * =)'會給你什麼? –