2015-10-06 1 views
1

Я использую cmdargs, чтобы получить некоторые аргументы из командной строки. Я использую некоторый специальный тип в моей программеHaskell Типовой экземпляр

data Function = Max 
       | Min 
       | Moy 
       | Med 
       deriving (Eq,Data,Typeable) 

я могу передать эти типы непосредственно в спорах с "Max" "Min" "Moy" "Med" путем получения Function типа данных в классах Data и Typeable. Моя проблема в том, что моя программа становится все сложнее, и мне нужно переименовать мой конструктор, чтобы избежать конфликтов имен.

data Function = funMax 
       | funMin 
       | funMoy 
       | funMed 
       deriving (Eq,Data,Typeable) 

Однако, я хотел бы сохранить доступ к этим конструктору с "Max" "Min" "Moy" "Med". Для этого, я полагаю, мне нужно создать свои собственные Data и Typeable экземпляры Function, это правильно?

Моя проблема: мне не удалось создать этот экземпляр даже после прочтения документации Hackage.

Вы успешно создали Data и Typeable экземпляров ваших собственных данных?

+0

Я запутался. Вы используете 'DataKinds' и продвигаете эти конструкторы или что-то еще? – dfeuer

+0

Я не могу понять этот вопрос. Вы хотите дать им разные имена, чтобы избежать конфликтов имен, но вы хотите получить к ним доступ со старыми именами. Это выглядит противоречиво мне. Как вы ожидаете, что это сработает? – chi

ответ

3

В последних версиях GHC Typeable просто не может быть определен пользователем. Предполагается, что его операции литья будут безопасными, и для этого допускаются только автоматически полученные экземпляры.

С GHC 7.10, она изменилась далее: Typeable теперь автоматически выводятся на всех типов, поэтому deriving Typeable на самом деле излишним (но может быть включена для обратной совместимости.)

Dataможет еще быть пользователем но я не уверен, что это хорошая идея. На самом деле для вашего случая использования я подозреваю, что было бы лучше использовать гораздо более простой класс Read.

Вы также можете избежать переименования конструкторов, разделив их в другой модуль, и импорт, что квалифицированный:

module Types.Fun where 
data Function = Max 
       | Min 
       | Moy 
       | Med 
       deriving (Eq,Data,Typeable) 

... 

module Main where 
import qualified Types.Fun as Fun 

... case ... of Fun.Max -> ...