组合类型=一个,另一个,或两者兼而有之?

时间:2015-03-30 16:52:49

标签: haskell types algebraic-data-types

我想知道在Haskell中这是否可行:

type DateTime = Date | Time | Date :+ Time

...因此它可以是特定日期,特定时间或由两者组成的复杂值。

1 个答案:

答案 0 :(得分:5)

你刚刚成功 - 当然有可能!

这就是我要做的:

data Both a b
    = First a
    | Second b
    | Both a b

有趣的是,这是一个bifunctor:

import Data.Bifunctor

instance Bifunctor Both where
    bimap f _ (First a)  = First (f a)
    bimap _ g (Second b) = Second (g b)
    bimap f g (Both a b) = Both (f a) (g b)

正如J. Abrahamson所说,包Data.These中有一个名为These的类型,其中包含MonadBifunctor个实例,还有一些很棒像BifoldableBitraversable这样的类型类实例完全值得一看。