Мне интересно, возможно ли это в Haskell:
type DateTime = Date | Time | Date :+ Time
...так что это может быть конкретная дата, конкретное время или комплексное значение, состоящее из того и другого.
Мне интересно, возможно ли это в Haskell:
type DateTime = Date | Time | Date :+ Time
...так что это может быть конкретная дата, конкретное время или комплексное значение, состоящее из того и другого.
Вы только что сделали это - конечно, это возможно!
Вот что я бы сделал:
data Both a b
= First a
| Second b
| Both a b
Интересно, что это бифунктор:
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)
Как Дж. Абрахамсон сказал, что в пакете These. ">Data.These
, который включает в себя экземпляры Monad
и Bifunctor
, а также некоторые замечательные экземпляры классов типов, такие как Bifoldable
и Bitraversable
, на которые стоит взглянуть.
Both a b
включать Both (Both a b) (Both a b)
? похоже на data Tree a b = Leaf a | Leaf b | Tree a b
.
- person Mark Cidade; 30.03.2015
a
и b
могут обозначать любой тип - почему бы и нет? Но этот тип Дерева немного не в себе, попробуйте еще раз!
- person AJF; 30.03.2015
Data.These
- person J. Abrahamson   schedule 30.03.2015Date
иTime
вместе» на самом деле является произведением обоих типов, а не суммой. В качестве ADT то, что вы хотите, записывается какDateTime = Date + Time + Date × Time
или, в Haskell,Either (Either Date Time) (Date, Time)
. Однако лучше определить тип с помощьюdata
, как это сделал AJFarmar, или использоватьThese
. - person leftaroundabout   schedule 30.03.2015Time
как о воображаемомDate
(Time = Date × sqrt(-1)
) : P - person Mark Cidade   schedule 30.03.2015