Введите сигнатуру функции, чтобы найти величину вектора - PullRequest
2 голосов
/ 16 апреля 2011

Следующая сигнатура типа для определения величины вектора, представленного в виде кортежа, не работает:

mag :: (Floating b, Num a) => (a,a) -> b
mag (x,y) = sqrt (x**2 + y**2)

Ошибка:

Couldn't match expected type `b' against inferred type `a'
  `b' is a rigid type variable bound by
      the type signature for `mag' at tone.hs:1:17
  `a' is a rigid type variable bound by
      the type signature for `mag' at tone.hs:1:24
In the expression: sqrt (x ** 2 + y ** 2)
In the definition of `mag': mag (x, y) = sqrt (x ** 2 + y ** 2)

1 Ответ

5 голосов
/ 16 апреля 2011

Один из способов вычисления сигнатуры типа - попросить компилятор сделать для вас вывод типа:

Prelude> let mag (x,y) = sqrt (x**2 + y**2)

Prelude> :t mag
mag :: Floating a => (a, a) -> a

Это, вероятно, тот тип, который вам нужен.


Теперь, ваш тип берет пару символов a и каким-то образом преобразует их в ab в классе Num.Вы имеете в виду преобразование в более общий класс Num?Если это так, вам понадобится truncate или что-то в этом роде и fromIntegral.

Я предполагаю, что это не то, что вы хотите, но вы можете сделать это,

Prelude> let mag (x,y) = fromIntegral . truncate $ sqrt (x**2 + y**2)

Prelude> :t mag
mag :: (Floating a, RealFrac a, Floating a) => (a, a) -> c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...