Перегрузка (+)
Я пытаюсь определить тип данных Vector3 в haskell и разрешить использовать (+) оператор. Я попробовал следующее:
data Vector3 = Vector3 Double Double Double
Vector3 x y z + Vector3 x' y' z' = Vector3 (x+x') (y+y') (z+z')
Но ghci жалуется на неоднозначное появление (+). Я не понимаю, почему возникновение неоднозначно; конечно, средство проверки типов может сделать вывод о том, что x, x ', y и т.д. имеют тип Double и, следовательно, правильный оператор для их использования - Prelude. +?
Я знаю, что я мог бы сделать Vector3 экземпляром класса Num, но это слишком ограничительно для меня; Я не хочу определять умножение вектора на другой вектор.
Ответы
Ответ 1
Единственный способ перегрузить имя в Haskell - использовать классы типов, поэтому у вас есть три варианта:
- Сделайте
Vector
экземпляр Num
и просто верните умножение error
.
- Используйте что-то вроде числовую прелюдию, которая определяет более мелкозернистые числовые классы.
- Выберите другое имя, например
.+.
или что-то подобное для добавления вектора.
Ответ 2
Я знаю, что я мог бы сделать Vector3
экземпляр класса Num
, но это слишком ограничительно для меня; Я не хочу определять умножение вектора на другой вектор.
Это было бы самым простым решением. Вы можете определить умножение как
(*) = error "vector multiplication not implemented"
Подумайте о векторных операциях, которые вы получите бесплатно!