Понимание типа оператора приведения в Scrap Your Boilerplate
В документе Scrap Your Boilerplate 2003 года от Laemmel и SPJ приведен фрагмент кода на странице 3.
mkT :: (Typeable a, Typeable b) => (b -> b) -> a -> a
mkT f = case cast f of
Just g -> g
Nothing -> id
а затем статья объясняет
То есть mkT f x применяет f к x, если тип x совпадает с типом аргумента f
Следуя схеме предыдущих примеров в статье, я думаю, что тип cast f
придется сравнивать с типом Maybe (b -> b)
для вышеизложенного оценить Just g
, но это кажется неверным.
Что здесь происходит с подписью cast f
?
1 ответ
Тип cast
является
cast :: (Typeable x, Typeable y) => x -> Maybe y
это производит Nothing
если x
а также y
разные типы и Just argument
если они одинаковы Обратите внимание, что тип результата, y
должен быть определен из вызывающего контекста, когда cast
используется. Если это не так, компиляция завершается неудачно с нерешенной ошибкой перегрузки / неоднозначной переменной типа.
В этом конкретном примере типы являются типами функций, (b -> b)
за аргумент и (a -> a)
за результат. Так
cast f :: Maybe (a -> a)
а также mkT
также может быть написано mkT = fromMaybe id . cast
,