Как бороться с ограничением класса типов в функции-члене класса - PullRequest
0 голосов
/ 08 октября 2018

GHCI жалуется на типы k и a внутри (k * a, k * b).Я думаю, он не знает, что k это Num, но я не знаю, как это указать.

module Point where

data Point x y = Point (x, y)

class Vector v where
  add :: v -> v -> v
  sub :: v -> v -> v
  mul :: Num k => k -> v -> v

instance (Num a, Num b) => Vector (Point a b) where
  add (Point (a, b)) (Point (c, d)) = Point (a + c, b + d)
  sub (Point (a, b)) (Point (c, d)) = Point (a - c, b - d)
  mul k (Point (a, b)) = Point (k * a, k * b)

1 Ответ

0 голосов
/ 08 октября 2018

Проблема в том, что ваша mul подпись говорит о том, что v можно умножить на любой тип k с экземпляром Num: Int, Double, Complex Double и т. Д. И т. П.

Но для векторных пространств вы хотите что-то совсем другое: сказать, что для каждого v существует определенный k.Это можно сделать двумя способами (после исправления data Point x = Point x x, как предлагается в комментариях):

  1. с использованием класса многопараметрического типа с функциональной зависимостью ;

  2. с использованием связанных типов .

Я изначально дал решения, используя оба, но может быть более полезным прочитатьсвязанную документацию и попробуйте сами.

...