Хаскель Универсальный Тип - PullRequest
0 голосов
/ 18 октября 2018

Так что я только начал изучать Haskell, и я застрял в этом уже довольно давно.Поэтому у меня есть функция, которая вычисляет число после смещения минус (минимальное значение равно 0).Мне удалось выполнить эту функцию с явно указанными типами.

offSetter :: Int -> Int -> Int
offSetter number offset
    | number - offset >= 0 = number - offset
    | otherwise = 0

Но когда я попытался изменить ее на использование универсальных типов, как показано ниже, она продолжает выдавать ошибку.Я делаю это неправильно?

offSetter :: Num a => a -> a -> a
offSetter number offset
    | number - offset >= 0 = number - offset
    | otherwise = 0

Ошибка, которую я получаю:

* Could not deduce (Ord a) arising from a use of '>='
      from the context: Num a
        bound by the type signature for:
                   offSetter :: forall a. Num a => a -> a -> a
        at src\test.hs:57:1-33
      Possible fix:
        add (Ord a) to the context of
          the type signature for:
            offSetter :: forall a. Num a => a -> a -> a
    * In the expression: number - offset >= 0
      In a stmt of a pattern guard for
                     an equation for `offSetter':
        number - offset >= 0

Ответы [ 2 ]

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

Как вы обнаружили, вам нужно добавить класс типа Ord в качестве ограничения к типу a со следующей сигнатурой типа:

offSetter :: (Num a, Ord a) => a -> a -> a

Это потому, что Ord является классом типас операторами сравнения, такими как (>=).

Итак, используется Ord, потому что есть такие элементы, как Strings, которые не применимы к Num?

Нет, поскольку Stringне являясь членом класса типов Num, исходное объявление уже исключает его в качестве возможного кандидата для типа a.Как я уже говорил ранее, вам нужно использовать Ord, чтобы гарантировать, что для типа a доступен оператор (>=).

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

Решил, добавив Ord a:

offSetter :: (Num a, Ord a) => a -> a -> a
offSetter number1 offSet
    | number1 - offSet >= 0 = number1 - offSet
    | otherwise = 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...