Понимание типа оператора приведения в 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,

Другие вопросы по тегам