Haskell 是否没有标准(或a)monad实例?
我的印象是,某个地方有一个例子,但我似乎找不到。我已尝试导入Control.Monad、Control.Monad.Instances和数据。如图所示Haskell 是否没有标准(或a)monad实例?,haskell,import,instance,monads,either,Haskell,Import,Instance,Monads,Either,我的印象是,某个地方有一个例子,但我似乎找不到。我已尝试导入Control.Monad、Control.Monad.Instances和数据。如图所示 module Main where import Control.Monad import Data.Either import Control.Monad.Instances test :: [Either a b] -> Either a [b] test = sequence main = return () 但ghc告诉我,
module Main where
import Control.Monad
import Data.Either
import Control.Monad.Instances
test :: [Either a b] -> Either a [b]
test = sequence
main = return ()
但ghc告诉我,它无法推断(单子(或a))。添加
使代码可以编译,但是这个实例声明看起来太一般了,如果它还没有出现在一些标准模块中,那么对我来说就没有意义了。如果是的话,我应该在哪里找到它,如果不是的话,有什么原因吗
--------------编辑---------------
请注意,我现在认为下面由user31708给出的答案(“从Base4.6开始,实例在数据中,或者实例本身”)是当前正确的答案。我不确定在这种情况下重新分配所选答案的正确方案,所选答案在提出问题时是正确的答案,因此我将其保留原样。如果有其他的指导方针,请纠正我。我相信
控件中有一些东西。Monad.Error
-但是没有任何东西需要检查。没有或a
的实例,但是控件.Monad.Error
中有for或String
。(实际上,它是针对错误e=>或e
,IIRC)。这已添加到base 4.3.x.x
中,它随ghc 7
一起提供。同时,您可以直接使用实例,或者,如果您使用实例,则可以使用实例来表示某事
这可能会失败,您应该使用monad transformer 从base 4.6开始,位于数据中。
本身。愚蠢错误约束的原因是使失败
正常工作。失败
方法失败的另一个原因。@sclv:我不确定我是否遵循了。我寻找的原因是为什么没有标准的(或a)monad实例声明。同时,transformers中的Control.monad.Trans.Error提供了一个相同的实例,以便在与旧版本的base一起使用时向后兼容,因此,如果导入该实例,则可以跨版本工作。
instance Monad (Either a) where
return = Right
Right b >>= f = f b
Left a >>= _ = Left a