#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, все операторы типов являются конструкторами , хотя в более конкретной документации говорится, что это решает ведущий
:
.