Во-первых, совершенно невозможно присвоить разные сигнатуры типа разным уравнениям для одной и той же функции. Любая функция может иметь только один тип, независимо от того, сколько в ней уравнений.
Во-вторых, отрицательные ограничения не имеют (не будут) никакого здравого смысла в Haskell. Вспомните, что означает ограничение класса:
f :: Num a => a -> a -> a
f x y = x + y
Num a
в типе f
означает, что мы можем применять любые методы класса класса типа Num
к значениям типа a
. Мы сознательно не называем конкретный тип, чтобы получить общее поведение. По сути, мы говорим: «Нас не волнует, что такое a
, но мы знаем, что к нему применимы Num
операции». Следовательно, мы можем использовать Num
методы на x
и y
, но не более того, то есть мы не можем использовать ничего кроме Num
методов на x
и y
. Вот что такое ограничения класса типов и зачем они нужны. Они определяют общий интерфейс для функции.
Теперь рассмотрим ваше воображаемое ограничение not Num a
. Какую информацию несет это заявление? Ну, мы знаем, что a
не должно быть Num
. Однако эта информация совершенно бесполезна для нас. Рассмотреть возможность:
f :: not Num a => a -> a
f = ???
Что можно поставить вместо ???
? Очевидно, мы знаем, что мы не можем разместить. Но кроме того, эта подпись имеет не больше информации, чем
f :: a -> a
и единственной операцией f
может быть id
(ну undefined
тоже возможно, но это уже другая история).
Наконец, рассмотрим ваш пример:
showSquare :: (Show a, not Num a) => a -> String
showSquare x = "I don't know how to square " ++ (show x)
Я не привожу первую часть вашего примера намеренно, см. первое предложение в моем ответе. У вас не может быть разных уравнений с разными типами. Но сама по себе эта функция совершенно бесполезна. Здесь можно смело убрать ограничение not Num a
, и это ничего не изменит.
Единственное использование таких отрицательных ограничений в статически типизированном Haskell — это создание ошибок времени компиляции, когда вы указываете, скажем, Int
для переменной с not Num a
-ограничениями. Но я не вижу в этом никакой пользы.
person
Vladimir Matveev
schedule
10.08.2012