2013-09-07 5 views
0

Короткая версия: Я хочу использовать псевдоним типа функций type myType = [Int] -> (Tree Int,[Int]), но полиморфно (это означает, что я могу положить что угодно, а не только Int). Как я могу это сделать?Полиморфные псевдонимы типов в haskell

Длинная версия: Я в настоящее время:

data Colour = R | B deriving (Show, Read, Eq) 
data Tree elt = E | T Colour (Tree elt) elt (Tree elt) deriving (Show, Read, Eq) 

type Set a = Tree a 

Я хотел бы иметь:

type Funcs = [elt] -> (Tree elt, [elt]) 

, а затем написать некоторые функции, которые будут иметь тип Funcs

treeify_zero :: Treeify_t 
treeify_zero lst = (E,lst) 

treeify_one :: Treeify_t 
treeify_one (h:t) = ((T R E h E), t) 

Как это. В настоящее время я не могу получить type Funcs = forall elt. [elt] -> (Tree elt, [elt]), чтобы нормально работать в GHCi. и если я использую type Funcs elt = [elt] -> (Tree elt, [elt]) GHCi жалуется на мои определения treeify_zero/one «должен иметь 1 аргумент, но не было дано ни В сигнатуре типа для` к ': для :: Treeify_t»

+0

Это 'Tree' или' Tre'? –

+0

@ KarolyHorvath: в моем собственном источнике я назвал его 'Tre', но подумал, что лучше задать его имя« Дерево », задавая вопрос. Я не изменил все экземпляры, приводящие к этим опечаткам. но теперь я исправил их –

ответ

2

Это звучит, как вы хотите параметризовать тип синоним - elt не может просто выйти из ниоткуда. Может быть, вы после

type Funcs elt = [elt] -> (Tree elt, [elt]) 

В качестве альтернативы вы хотите какой-либо другой связующий, как type Funcs = forall elt. [elt] -> (Tree elt, [elt]). Но вы не сказали, что вы пытаетесь сделать, поэтому трудно сказать. :-)

+0

Ну, я пытаюсь реализовать интересный алгоритм, который преобразует список чего-либо (elt) в набор (с конкретной реализацией упорядоченных красно-черных деревьев) того же самого, что и я, m не уверен, имеет ли значение elt зависимый тип. В чем разница между вашим предыдущим и последним примерами? в обоих мы получаем полиморфный тип, который имеет функции, которые идут из списков в (дерево, список) правильно? –

+0

Кроме того, я не очень хорошо понимаю 'тип' в Haskell. Я бы подумал, что 'type Funcs elt' означает тип функций, которые от' elt 'до пары дерева' elt' и 'elt'. Что это значит? –

+1

@CESally 'type Funcs elt = [elt] -> (Tree elt, [elt])' означает, что вы видите 'Funcs foo' в сигнатуре типа, вы можете заменить его' ([foo] -> (Tree foo, [foo]) '. –

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