Почему нельзя ставить сигнатуры типов в объявлениях экземпляров в Haskell? - PullRequest
17 голосов
/ 03 декабря 2011

Мне нравится помещать сигнатуры типов для всех определений верхнего уровня в моем коде.Однако подписи типов в объявлениях экземпляров, по-видимому, недопустимы, и если я их укажу, я получаю ошибку «Неправильная подпись типа» от GHC.Почему это так?Почему GHC не может проверить, совпадает ли сигнатура типа с ожидаемой, и отклонить (или предупредить), если это не так?

Ответы [ 5 ]

13 голосов
/ 29 октября 2014

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

11 голосов
/ 03 декабря 2011

Вы можете создавать функции отдельно, вне тела экземпляра, если вы действительно хотите объявления типа.

class Class a where
    f1 :: a -> a

instance Class Foo where
    f1 = foo_f1

--monomorphic version of f1 for Foo:
foo_f1 :: Foo -> Foo
foo_f1 = ...
6 голосов
/ 14 марта 2018

Большинство других ответов здесь довольно старые ... теперь есть расширение языка:

вставьте следующее в начало вашего файла:

{-# Language InstanceSigs #-}
5 голосов
/ 03 декабря 2011

Поскольку подпись является частью определения класса, подпись типа в объявлении экземпляра будет дубликатом подписи.Я не думаю, что есть проблема с разрешением дублирования подписей в принципе, но нет никакого преимущества в том, чтобы разрешать их вообще, и их проще запретить.Таким образом, определение языка говорит, что на сущность может быть не более одной сигнатуры типа.Возможность разрешать подписи также в объявлениях экземпляров не была востребована, поэтому расширения для нее нет.Если вы действительно этого хотите, вы можете запросить функцию на GHC trac .Если он получит достаточный интерес, он может быть реализован (но я не ожидаю, что спрос будет высоким).

2 голосов
/ 03 декабря 2011

В любом случае тип является избыточным, и обычно требуется избежать избыточности. В Frege , тем не менее, разрешено писать сигнатуры типов для членов экземпляра. Они проверены и затем выброшены. Конечно, проще сразу их запретить.

...