Haskell: проблемы с перегрузкой: интерпретатор не может сказать, какой + использовать - PullRequest
2 голосов
/ 20 апреля 2010

Я хочу сделать функции Double -> Double экземпляром класса типов Num. Я хочу определить сумму двух функций как сумму их изображений. Итак, я написал

instance Num Function where

f + g = (\ x -> (f x) + (g x))

Здесь компилятор жалуется, что не может сказать, использую ли я Prelude. + Или Module. + в лямбда-выражении. Поэтому я импортировал Prelude, квалифицированный как P, и написал

instance Num Function where

f + g = (\ x -> (f x) P.+ (g x))

Это прекрасно компилируется, но когда я пытаюсь добавить две функции в GHCi переводчик снова жалуется, что не может сказать, использую ли я Prelude.+ или Module.+. Можно ли как-нибудь решить эту проблему?

1 Ответ

7 голосов
/ 20 апреля 2010

Компилятор жалуется, потому что вы определяете новую функцию с именем +, а не определяете реализацию + для экземпляра класса. Вы забыли сделать отступ для определения функции? Вы хотите что-то вроде этого:

instance Num (Double -> Double) where
    f + g = (\ x -> (f x) + (g x))

Не так:

instance Num (Double -> Double) where

f + g = (\ x -> (f x) + (g x))

Тем не менее, экземпляр Num для типа функции на самом деле не будет работать должным образом по разным причинам, наиболее важно то, что экземпляры Num также должны быть экземплярами Eq и Show, ни из которых действительно могут быть определены для функций способом, который имеет смысл.

...