Вот что я пытаюсь достичь:
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}
module Action where
import Data.Type.Set
data Configuration
= A
| B
| C
data Action (configuration :: Configuration) where
Action1 :: Member cfg '[ 'A ] => Action cfg
Action2 :: Member cfg '[ 'B, 'C ] => Action cfg
Action3 :: Member cfg '[ 'A, 'C ] => Action cfg
exhaustive :: Action 'A -> ()
exhaustive Action1 = ()
exhaustive Action3 = ()
У меня есть набор действий и набор конфигураций, но некоторые действия имеют смысл только в некоторых конфигурациях.Мне бы не хотелось явно отбрасывать ненужные действия в конфигурации, поэтому я подумал об использовании GADT.К сожалению, средство проверки типов не может понять, что моя exhaustive
функция действительно исчерпывающая.
Интересно, могу ли я использовать какой-либо из существующих списков / наборов на уровне типов или даже типы строк (как в http://hackage.haskell.org/package/row-types-0.2.3.0/docs/Data-Row-Variants.html), чтобы решить эту проблему.
Я также попробовал подход, где Action2 :: Action '[ 'B, 'C ]
и выдвижение ограничений класса типов в exhaustive
, но безуспешно.
Спасибо за любые предложения!(или даже причины, по которым это плохая идея или неосуществимая легко)