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

Mar*_*ade 0 haskell types algebraic-data-types

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

type DateTime = Date | Time | Date :+ Time
Run Code Online (Sandbox Code Playgroud)

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

AJF*_*mar 5

你刚刚做到了 - 当然有可能!

这就是我要做的:

data Both a b
    = First a
    | Second b
    | Both a b
Run Code Online (Sandbox Code Playgroud)

有趣的是,这是一个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)
Run Code Online (Sandbox Code Playgroud)

J.亚伯拉罕说,有一种叫做类型These的包Data.These,它包括MonadBifunctor实例,以及像一些真棒类型类实例BifoldableBitraversable,是完全值得具有在偷看.

  • @Mark Cidade`a`和`b`可以代表任何类型 - 为什么不呢?但是那种Tree类型有点偏,有另一种去! (2认同)