Подтвердить что ты не робот

Почему нельзя помещать подписи типа в объявлениях экземпляров в Haskell?

Мне нравится ставить сигнатуры типов для всех определений верхнего уровня в моем коде. Тем не менее, типы подписей в объявлениях экземпляров, похоже, не разрешены, и, если я их поместил, я получаю ошибку "Misplaced type signature" от GHC. Почему это так? Почему GHC не может проверить, совпадает ли подпись типа с тем, что она ожидала, и отклонить (или предупредить), если это не так?

4b9b3361

Ответ 1

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

Ответ 2

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

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 = ...

Ответ 3

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

Ответ 4

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