Перегрузка (+)

Я пытаюсь определить тип данных 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"

Подумайте о векторных операциях, которые вы получите бесплатно!