2013-09-29 2 views
3

Например, скажем, у меня есть [Либо Int Bool], и я хочу, чтобы преобразовать его в HList .... такМожно ли преобразовать список «Либо» в «HList» в Haskell?

[Left 1, Right False, Left 2] 

станет

1 .*. False .*. 2 .*. HNil 

(я на самом деле думаю, что это невозможно, но хотелось бы услышать иначе .... даже писать тип для такой функции кажется невозможным, хотя, возможно, есть способ сделать это, что связано не только с написанием функции).

ответ

1

Вы не можете преобразовать [Either Int Bool] в HList, потому что это динамическое значение, но HList имеет статический тип, который зависит от его значения. Рассмотрим следующий пример:

  • 1 .*. False .*. 2 .*. HNil имеет тип HCons 1 (HCons False (HCons 2 HNil))
  • 1 .*. HNil имеет тип HCons 1 HNil

Оба эти значения являются возможные результаты вашей предполагаемой функции преобразования, но они имеют разные типы.

Вышеприведенное все потому, что информация о том, какое значение имеет HList, должна быть доступна компилятору, чтобы выяснить его тип. В вашем случае вы можете получить это значение только во время выполнения, то есть когда программа уже скомпилирована.

+0

Я подозревал, что ... Это ограничение времени компиляции означает, что HList - это довольно много кортежей (плюс, по общему признанию, полезная функция добавления)? – jamshidh

+0

Да, по этому свойству они очень похожи. Фактически, с самым примитивным подходом ваш HList может быть закодирован как «(1, (False, (2,())). Однако мощность HList находится в программировании на уровне типа (компиляции). Фактическое поле их применения очень ограничено и, кажется, более академично, чем практично. Изучение типов семей может помочь в понимании целей HLists. –

1

См. this post by Oleg о том, как сделать расширяемые варианты с помощью HList.

+0

Я прочитал сообщение и нашел интересным, хотя он не касается моего вопрос ... Это описание того, что такое HList (они используют homebrew, а не используют Data.HList, но это та же идея). Я что-то пропустил? Как указывает Никита, тип функции преобразования isn 't даже непротиворечивый, так что это кажется невозможным. – jamshidh

+0

Версия HList на Hackage - это доморощенный, оригинал Олега :). Сообщение показывает, как кодировать тип суммы (вариант aka, например, «Любой из них») с точки зрения HList, путем реализации конструкторов слева/справа в качестве функций селектора в записи HList, представляющей функцию, которую вы хотите применить к вашему " Либо ". Он не * конвертирует * как таковой, нет. – barsoap

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