Мне нравится помещать сигнатуры типов для всех определений верхнего уровня в свой код. Однако сигнатуры типов в объявлениях экземпляров кажутся недопустимыми, и если я их поставлю, я получаю сообщение об ошибке «Неуместная сигнатура типа» от GHC. Почему это так? Почему GHC не может проверить, совпадает ли сигнатура типа с ожидаемой, и отклонить (или предупредить), если это не так?
Почему нельзя помещать сигнатуры типов в объявления экземпляров в Haskell?
Ответы (5)
Вы можете добавить подписи типов для экземпляров, используя [новый] - XInstanceSigs, что особенно полезно для переноса переменных типа в область видимости. Дополнительную информацию можно найти в официальные документы.
Вы можете создавать функции отдельно, вне тела экземпляра, если вам действительно нужны объявления типов.
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 = ...
Большинство других ответов здесь довольно старые ... теперь есть расширение языка:
приклейте следующее вверху файла:
{-# Language InstanceSigs #-}
Поскольку подпись является частью определения класса, подпись типа в объявлении экземпляра будет дублированной подписью. Я не думаю, что есть проблема с разрешением дублирования подписей в принципе, но нет никакого преимущества в том, чтобы разрешить их в целом, и их проще запретить. Таким образом, определение языка говорит, что для каждой сущности может быть не более одной сигнатуры типа. Особенность разрешения подписей также в объявлениях экземпляров особо не запрашивалась, поэтому расширения, позволяющего это, нет. Если вы действительно этого хотите, вы можете отправить запрос функции в GHC trac < / а>. Если он вызовет достаточный интерес, он может быть реализован (но я не ожидаю, что спрос будет высоким).
T
a Functor
, нужно определить fmap :: T (a -> b) -> T a -> T b
(путать с Applicative
) и написать эту сигнатуру типа вместе с некоторой сложной реализацией fmap
. Несомненно, сигнатура этого типа неверна, она должна быть такой-то и такой-то! error будет легче понять, чем то, что не может соответствовать bar с foo, ожидаемым baz, фактической ошибкой quux, которая будет сгенерирована.
- person Prateek; 03.12.2011
В любом случае тип является избыточным, и обычно требуется избежать дублирования. В Frege, тем не менее, разрешено писать сигнатуры типов для членов экземпляра. Их проверяют, а затем выбрасывают. Их, конечно, проще сразу запретить.