LINUX.ORG.RU

История изменений

Исправление korvin_, (текущая версия) :

хаскель сам выведет тип как foo :: (Num a) => a -> a -> a. Иначе этот код смысла не имеет.

Но ведь не все полиморфные функции требуют ограничение тайпклассом. Та же map например.

Тайпклассы все же, ИМХО, больше нужны для ad-hoc полиморфизма (перегрузки), что в шарпе делается наследованием. Т.е. хаскелл и шарп тут как бы противоположны: в хаскелле параметрический полиморфизм (функций и типов) «первичен», а специальный (тайпклассы) «прикручен сбоку», в шарпе наоборот — специальный (наследование и перегрузка методов) «первичен», а параметрический (дженерики) «прикручен сбоку».

Разница в том, что в хаскелле перегрузка статическая, а в шарпе динамическая, поэтому в шарпе полностью вывести тип во время компиляции не всегда возможно.

Ну это все несколько условно и грубо, наверное.

Исходная версия korvin_, :

хаскель сам выведет тип как foo :: (Num a) => a -> a -> a. Иначе этот код смысла не имеет.

Но ведь не все полиморфные функции требуют ограничение тайпклассом. Та же map например.

Тайпклассы все же, ИМХО, больше нужны для ad-hoc полиморфизма (перегрузки), что в шарпе делается наследованием. Т.е. хаскелл и шарп тут как бы противоположны: в хаскелле параметрический полиморфизм (функций и типов) «первичен», а специальный (тайпклассы) «прикручен сбоку», в шарпе наоборот — специальный (наследование и перегрузка методов) «первичен», а параметрический (дженерики) «прикручен сбоку».

Разница в том, что в хаскелле перегрузка статическая, а в шарпе динамическая.

Ну это все несколько условно и грубо, наверное.