Я изучаю тип Семьи и пытаюсь понять, почему я не получаю ошибку времени компиляции в конкретном случае.Общие сведения о типах семейств
Мой тип семьи определяется следующим образом:
type family Typ a b :: Constraint
type instance Typ (Label x) (Label y) =()
У меня есть две функции, как показано ниже:
func1 :: (Typ (Label "la") (Label "lb")) => Label "la" -> Label "lb" -> String
func1 = undefined
func2 :: (Typ (Label "la") String) => Label "la" -> String -> String
func2 = undefined
Обе эти функции компиляции OK.
Когда я пытаюсь просмотреть тип func1
, я получаю правильную подпись. Но, когда я пытаюсь посмотреть тип func2
, я получаю сообщение об ошибке следующее сообщение об ошибке
Не удалось вывести (Typ (Ярлык «ла») Строка)
Почему это так? Может ли кто-нибудь помочь мне понять?
Мое предположение состоит в том, что это потому, что существует экземпляр, объявленный для 'Typ (Label x) (Label y)', но не для 'Typ (Label x) String'. Каково определение «Лейбл»? – ryachza
'data Label (l :: Symbol) = Get' Я надеялся получить ошибку времени компиляции для' func2', а не ошибку времени выполнения –
Возможно, вас заинтересует [это обсуждение сокращения контекста] (https://www.haskell.org/onlinereport/haskell2010/haskellch4.html#x10-910004.5.3). Я испытываю соблазн назвать это ошибкой, которую жалуется ghci: вероятно, это не должно приводить к уменьшению контекста для пользовательских подписей типа. Обратите внимание, что, конечно, если вы когда-либо пытались использовать 'func2' в реальной программе, которая в конечном итоге вернулась бы к« main », которая не имеет никакого контекста, и, в частности, не будет разрешено иметь« Typ (Label «la»)) String' в его контексте - вы получите ошибку типа. –