Перечень ГАДЦ в Хаскеле
Не могли бы вы сказать мне, есть ли какие-либо расширения механизма получения Haskell для класса Enum? Я имею в виду, что есть много разумных ситуаций, кроме случая `` нулевых конструкторов ''. Есть ли работы на эту тему?
1 ответ
Тебе действительно нужны ГАДЦ? Или вы просто хотите снять ограничение для простого перечислимого типа только с нулевыми конструкторами? Если последнее, то есть варианты. Одним из них является использование GHC Generic
механизм вместе с реализацией подходящего универсального класса перечисления. Это доступно в generic-deriving
пакет. Вот пример:
{-# LANGUAGE DeriveGeneric #-}
import Generics.Deriving
data Tree a = Leaf a | Node (Tree a) (Tree a)
deriving (Show, Generic)
instance GEnum Bool
instance GEnum a => GEnum (Tree a)
test :: [Tree Bool]
test = take 10 genum
Сейчас, test
это следующий список:
[ Leaf False
, Node (Leaf False) (Leaf False)
, Leaf True
, Node (Leaf False) (Node (Leaf False) (Leaf False))
, Node (Node (Leaf False) (Leaf False)) (Leaf False)
, Node (Leaf False) (Leaf True)
, Node (Node (Leaf False) (Leaf False)) (Node (Leaf False) (Leaf False))
, Node (Leaf True) (Leaf False),Node (Leaf False) (Node (Leaf False) (Node (Leaf False) (Leaf False)))
, Node (Node (Leaf False) (Leaf False)) (Leaf True)
]
Эта реализация genum
использует диагонализацию для объединения продуктов. Это гарантирует, что каждое значение действительно появляется где-то в списке, но может привести к неожиданному порядку.