2016-03-01 2 views
0

У меня есть структура данных с параметром типа Fluent. Мне нужен список из них. Какой самый элегантный способ исправить этот код?Как создать тип данных со значением конструктор, содержащий список типов типов типов

data Fluent t = Fluent [t] 
data Obj = Obj [Fluent] 

Edit: Я хочу быть в состоянии сделать это:

f1 = Fluent [True, False] 
f2 = Fluent [1, 2, 3, 4] 
let o = Obj [f1, f2] 
+1

Ваш пример показывает, как один может построить значение «Obj». Как насчет ликвидации/разрушения? I.e., как вы ожидаете _use_ значение типа 'Obj'? Если вы обращаетесь к его внутренним элементам, они имеют неизвестный тип, поэтому вы не можете ничего с ними делать, что требует статических типов (т. Е. Всего). Таким образом, вам нужно либо использовать типы Dynamic, либо некоторые более точные типы Obj/Fluent, которые содержат некоторую информацию о типе (возможно, с GADT, но это трудно сказать). – chi

ответ

3

Вы должны распространяться параметр типа t до типа Obj:

data Fluent t = Fluent [t] 
data Obj t = Obj [Fluent t] 

:t Obj $ map Fluent ["a", "bcd"] -- Obj Char 
+0

Мне не нужен тот же тип для каждого 'Свободного' в списке – BinRoot

+2

@BinRoot Попробуйте этот эксперимент: притворись, что кто-то уже исправил Obj, а затем выпишите примерное выражение, которое вы хотели бы использовать, а также его тип , Заметьте, что я сделал то же самое в своем примере. Если бы мы знали, как вы хотели, чтобы ваш тип вел себя, было бы меньше догадок пытаться предоставить решения. – amalloy

+1

@BinRoot Если вы полностью потеряете информацию о том, что такое 't',' Obj' становится списком неизвестных вещей. С таким списком вы не можете многое сделать. В вашем примере, предполагая, что это сработало, никто не может фактически получить доступ к 'o' за счет подсчета количества элементов. Это происходит потому, что, например, 'head (head o)' будет неизвестного типа, поэтому вы не сможете его использовать нигде. – chi

Смежные вопросы