2
есть способ использовать шаблоны шаблоны для конструкторов типов, чтобы сделать этот уродливый код короче:сравнить содержимое типа Либо
eitherCompare (Left a) (Left b) = compare a b
eitherCompare (Left a) (Right b) = compare a b
eitherCompare (Right a) (Left b) = compare a b
eitherCompare (Right a) (Right b) = compare a b
что-то вроде (не компилируется)
eitherCompare :: Ord a => Either a a -> Either a a -> Ordering
eitherCompare (_ a) (_ b) = compare a b
или какой-то другой метод?
Более простое определение '' fromEither' является fromEither = либо идентификатор id'. – amalloy
Это, вероятно, слишком придирчиво, что даже стоит упомянуть, но это не совсем эквивалентно исходной версии (представьте, что один или оба из 'x' и' y' являются '_ | _' и' compare' ленивы в соответствующем аргумент). –
@ReidBarton Исходная версия также была строгой в обоих аргументах. –