Есть ли в Haskell перегрузка возвращаемого типа?

Основываясь на том, что я читал о Haskell, и экспериментах, которые я провел с GHC, кажется, что Haskell имеет перегрузку возвращаемого типа (, также известную как специальный полиморфизм ). Одним из примеров этого является функция fromInteger, которая может дать вам Doubleили Integerв зависимости от того, где используется результат. Например:

fd :: Double -> String
fd x = "Double"

fi :: Integer -> String
fi x = "Integer"

fd (fromInteger 5)  -- returns "Double"
fi (fromInteger 5)  -- returns "Integer"

«Нежное введение в Haskell» , кажется, соглашается с этим, когда говорит:

The kind of polymorphism that we have talked about so far is commonly called parametric polymorphism. There is another kind called ad hoc polymorphism, better known as overloading. Here are some examples of ad hoc polymorphism:

  • The literals 1, 2, etc. are often used to represent both fixed and arbitrary precision integers.

Если числовые литералы считаются примером специального полиморфизма (, также известного как перегрузка ), то похоже, что то же самое верно и для результата таких функций, как fromInteger.

И на самом деле, я нашел несколько ответов на другие вопросы о переполнении стека , которые предполагают, что Haskell имеет перегрузку по типу возвращаемого значения.

Однако по крайней мере один программист на Haskell сказал мне, что это не перегрузка возвращаемого типа, а пример «параметрического полиморфизма, когда параметр связан универсальным квантором».

Я думаю, что он имеет в виду, что fromIntegerвозвращает значение из каждого экземпляраNum(вид недетерминированного типа ).

Это кажется разумной интерпретацией, но, насколько я могу судить, Haskell никогда не позволяет нам просматривать более одного из этих значений экземпляра (отчасти благодаря ограничению мономорфизма). Также кажется, что фактическое значение экземпляра, на которое мы смотрим, может быть определено статически. Из-за всего этого кажется разумным сказать, что в выражении fd (fromInteger 5)подвыражение fromInteger 5имеет тип Double, а в выражении fi (fromInteger 5)подвыражение fromInteger 5имеет тип Integer.

Итак, есть ли в Haskell перегрузка возвращаемого типа?

Если нет, приведите пример одного из следующих:

  • действительный код Haskell, который вел бы себя иначе, если бы Haskell имел перегрузку типа возвращаемого значения
  • допустимый код Haskell, который был бы недействительным, если бы Haskell имел перегрузку возвращаемого типа
  • недопустимый код Haskell, который был бы действителен, если бы Haskell имел перегрузку возвращаемого типа

18
задан Community 23 May 2017 в 11:52
поделиться