ill*_*out 4 haskell types scala
是否有一个标准的专业化Either在Haskell或Scala中,使所含的类型Left和Right同类型的?
在Haskell中,我想要这样的东西:
data SpecializedEither a = Left a | Right a
Run Code Online (Sandbox Code Playgroud)
这也可以被认为是一种轻微的概括Maybe,使得Nothing保持一个价值.
编辑:Ganesh提出了一个非常好的观点,即无法为此类型定义Monad实例.有没有更好的方法来做我想做的事情?
J. *_*son 11
只要是a,就有一个标准Monad实例((,) e)eMonoid
instance Monoid e => Monad ((,) e) where
return a = (mempty, a)
(e1, a) >>= f = let (e2, b) = f a in (e1 <> e2, b)
Run Code Online (Sandbox Code Playgroud)
由于Either a a和(Bool, a)是同构的(有两种方式),我们得到了一个Monad尽快实例作为我们挑选Monoid的Bool.有两个(真四,看评论)这样的Monoid年代,"和"型和"或"类型.从本质上讲,这种选择最终决定是否对Left还是Right你要么是"默认"的一面.如果Right是默认值(从而Left覆盖它),那么我们得到
data Either1 a = Left1 a | Right1 a
get1 :: Either1 a -> a
get1 (Left1 a) = a
get1 (Right1 a) = a
instance Monad Either1 where
return = Right1
x >>= f = case (x, f (get1 x)) of
(Right1 _, Right1 b) -> Right1 b
(Right1 _, Left1 b) -> Left1 b
(Left1 _, y ) -> Left1 (get1 y)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
229 次 |
| 最近记录: |