То, как Haskell разработан очень много противоположность понятию instanceof
проверки. Конструкция Haskell не включает такую проверку типа времени выполнения, потому что Haskell очень ориентирован на сильные гарантии времени компиляции: функция не должна более точно узнать тип своих аргументов во время выполнения, чем она знает их во время компиляции.
Это не означает, что функция не существует в ответ на Haskell-Ли демонстрирует, как это сделать, но в Haskell это неавтоматического функция обеспечивается библиотеки, не является основной частью языка (в отличие от языка, такого как Java, где это основная функция, которая всегда присутствует - вы не можете отказаться от нее!).
Обратите внимание, что даже в объектно-ориентированном программировании оператор instanceof
является спорным. Многие объектно-ориентированные программисты очень сильно советуют не использовать его. Несколько примеров (из сотен):
Т он советует, чтобы все из них были одинаковыми: вместо того, чтобы тестировать тип ссылки и переключаться на разные типы поведения на основе этого, используйте полиморфизм: определите интерфейс или класс, который имеет метод для операции, которую вы хотите, и объекты, которые вы тестировали с помощью instanceof
, реализуют свои собственные версии этого метода, чтобы делать правильные вещи.
Этот совет можно перевести прямолинейно в Haskell:
- Определите свой собственный класс типа, чтобы представить поведение, которое вы хотите
- Реализовать этот тип класса для каждого из типов, которые вы заинтересованы в, с правильное поведение для каждого.
Таким образом, вы могли бы сделать что-то вроде этого:
class ToString a where
toString :: a -> String
instance ToString String where
toString str = str
instance ToString Integer where
toString i = show i
-- ...
Это вообще плохая идея, для чего это стоит. –
Кстати, вы уже знаете это, но так как вы новичок: часть, которая перед символом '=>' называется контекстом (в вашем случае это 'Show a'). Поскольку есть только один, вам не нужно использовать круглые скобки. – MasterMastic
@ LouisWasserman вы можете объяснить, почему? –