Символьное имя как конструктор типов

#haskell

#haskell

Вопрос:

Извините, вопрос новичка о Haskell…

Что мне нужно сделать, чтобы использовать инфиксный символ в качестве конструктора типов? Я нашел следующий фрагмент кода, но ghc и ghci жалуются на «Неожиданный тип `~>’, где ожидается переменная типа»…

 class Category (~>) where
(.) :: (a ~> b) -> (b ~> c) -> (a ~> c)
id  :: a ~> a
  

Как это можно сделать? Заранее большое спасибо!

Комментарии:

1. У вас не может быть символа в качестве переменной типа (или обычной переменной).

2. Он нашел этот фрагмент кода в этой статье tailcalled.wordpress.com/2012/04/03 /. ….. Так это только псевдокод?

Ответ №1:

Начиная с GHC 7.6, все TypeOperators всегда являются конструкторами. Я не уверен, почему это так, но я предполагаю, что это критическое изменение заключается в том, чтобы избежать взлома еще более старого кода. Дополнительная информация в списке рассылки.

Комментарии:

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

2. Действительно, переменные инфиксного типа довольно глупы, поскольку переменные типа всегда являются локальными; было бы стыдно тратить хорошее пространство имен на их поддержку. Разве это не нарушает соответствие между конструкторами типа и данных? Или конструкторы данных также изменены?

Ответ №2:

Конструкторы инфиксных типов должны начинаться с a : . Попробуйте переписать свой код, чтобы использовать :~>

http://www.haskell.org/ghc/docs/7.0.3/html/users_guide/data-type-extensions.html

Комментарии:

1. Это не конструктор типов; это переменная типа. Я не понимаю, почему это не работает так, как написано.

2. @dfeuer: Я предполагаю, что ваша интерпретация кода верна, но заголовок вопроса и текст вопроса говорят об определении новых конструкторов типов. Может быть, OP может немного расшириться, чтобы устранить эту путаницу?

3. Ну, по крайней мере, я не знаю, какое расширение я должен использовать, чтобы заставить его работать так, как написано. ghc сообщает мне, что -fglasgow-exts устарел…

4. Они испортили документацию. Начиная с версии 7.6, все операторы типов являются конструкторами , хотя в более конкретной документации говорится, что это решает ведущий : .