Недавно я взглянул на Haskell, используя LYAH.Haskell Почему «Num x» требует «Показать x»?
я бездельничал с классами типа и написал эту функцию быстрого тест:
foo :: (Num x) => x -> String
foo x = show x ++ "!"
Но что вызывает эту ошибку:
test.hs:2:9:
Could not deduce (Show x) arising from a use of `show'
from the context (Num x)
bound by the type signature for foo :: Num x => x -> String
at test.hs:1:8-29
Possible fix:
add (Show x) to the context of
the type signature for foo :: Num x => x -> String
Но согласно Лях:
To join Num, a type must already be friends with Show and Eq.
Так что если все в Num
является подмножеством Show
и Eq
, почему мне нужно изменить подпись типа на foo :: (Num x, Show x) => x -> String
, чтобы это работало? Нельзя ли сделать вывод, что Num
также доступен для показа?
Итак, какие подклассы 'Num' _don't_ имеют' Eq' или 'Show' больше? Я не вижу никаких списков о том, что их получило (или почему это вообще было изменено вообще). – charmlessCoin
Раньше это было 'class (Eq a, Show a) => Num a where {...}', теперь это просто 'class Num a where {...}'. Не нужно было иметь 'Eq' и' Show' в качестве суперкласса: экземпляр 'Num' не подразумевает экземпляр любого из этих классов (например,' Ord' подразумевает 'Eq') и не зависит от них ('Num' не имеет законов, и определения по умолчанию для его« методов »не относятся к« Eq »или« Show »). Я думаю, именно поэтому 'Num' стал самостоятельным классом. Меньшие требования означают, что класс допускает больше экземпляров, таких как 'Num b => Num (a -> b)'. –
Важно отметить, что это изменение GHC; стандарт Haskell по-прежнему требует суперкаров «Show» и «Eq».В строгом смысле это делает GHC компилятором, не совместимым с Haskell; однако это изменение, скорее всего, вступит в следующий стандарт, так же, как скоро «Аппликативный» станет суперклассом «Монады». – David