История изменений
Исправление korvin_, (текущая версия) :
хаскель сам выведет тип как foo :: (Num a) => a -> a -> a. Иначе этот код смысла не имеет.
Но ведь не все полиморфные функции требуют ограничение тайпклассом. Та же map например.
Тайпклассы все же, ИМХО, больше нужны для ad-hoc полиморфизма (перегрузки), что в шарпе делается наследованием. Т.е. хаскелл и шарп тут как бы противоположны: в хаскелле параметрический полиморфизм (функций и типов) «первичен», а специальный (тайпклассы) «прикручен сбоку», в шарпе наоборот — специальный (наследование и перегрузка методов) «первичен», а параметрический (дженерики) «прикручен сбоку».
Разница в том, что в хаскелле перегрузка статическая, а в шарпе динамическая, поэтому в шарпе полностью вывести тип во время компиляции не всегда возможно.
Ну это все несколько условно и грубо, наверное.
Исходная версия korvin_, :
хаскель сам выведет тип как foo :: (Num a) => a -> a -> a. Иначе этот код смысла не имеет.
Но ведь не все полиморфные функции требуют ограничение тайпклассом. Та же map например.
Тайпклассы все же, ИМХО, больше нужны для ad-hoc полиморфизма (перегрузки), что в шарпе делается наследованием. Т.е. хаскелл и шарп тут как бы противоположны: в хаскелле параметрический полиморфизм (функций и типов) «первичен», а специальный (тайпклассы) «прикручен сбоку», в шарпе наоборот — специальный (наследование и перегрузка методов) «первичен», а параметрический (дженерики) «прикручен сбоку».
Разница в том, что в хаскелле перегрузка статическая, а в шарпе динамическая.
Ну это все несколько условно и грубо, наверное.