Допустим, у меня есть следующий (глупый) класс:Унификация Weirdness в класс типов Instance
class BlindMap m where
mapB :: m a -> m b
я мог бы предоставить следующий []
экземпляр:
instance BlindMap [] where
mapB = map id
Тип ОРЗ является [a] -> [a]
, который должен унифицировать с [a] -> [b]
, но GHC так не считает:
Couldn't match type ‘a’ with ‘b’
‘a’ is a rigid type variable bound by
the type signature for mapB :: [a] -> [b] at dingas.hs:11:5
‘b’ is a rigid type variable bound by
the type signature for mapB :: [a] -> [b] at dingas.hs:11:5
Expected type: a -> b
Actual type: b -> b
Relevant bindings include
mapB :: [a] -> [b]
In the first argument of ‘map’, namely ‘id’
In the expression: map id
Что мне здесь не хватает?
Заранее спасибо.
Да, вы правы! – josejuan
Короче говоря, '[a] -> [a]' и '[a] -> [b]' действительно объединяются; но объединение здесь не представляет интереса. Вместо этого интерес представляет проверка типа; «может ли этот термин получить этот тип?». 'map id' не может быть задан тип' [a] -> [b] '- вы считаете это, или это также является частью путаницы? –
Да, я не понял, что типы реализации метода должны быть _exactly_ равными типу, указанному классом, а не просто унифицированным. – TWhit