Подтвердить что ты не робот

Избегайте предупреждения. По умолчанию следующие ограничения (-и), чтобы ввести `Integer '

Я определил следующую функцию, чтобы отменить список Int или string:

myReverse :: [a] -> [a]
myReverse [] = []
myReverse (x:xs) = (myReverse xs) ++ [x]

Мой тест с hspec:

 describe "myReverse" $ do
  it "returns the inversed list of the given list" $ do
   myReverse [1,2,3,4] `shouldBe` [4,3,2,1]

  it "returns the inversed string of the given string" $ do
   myReverse "A man, a plan, a canal, panama!" `shouldBe` "!amanap ,lanac a ,nalp a ,nam A"

Вроде я получаю предупреждение

tests/OneToTenSpec.hs:69:24:
    Warning: Defaulting the following constraint(s) to type `Integer'
               (Eq a0)
                 arising from a use of `shouldBe' at tests/OneToTenSpec.hs:69:24-33
               (Num a0)
                 arising from the literal `1' at tests/OneToTenSpec.hs:69:15
               (Show a0)
                 arising from a use of `shouldBe' at tests/OneToTenSpec.hs:69:24-33
    In a stmt of a 'do' block:
      myReverse [1, 2, 3, 4] `shouldBe` [4, 3, 2, 1]
    In the second argument of `($)', namely
      `do { myReverse [1, 2, ....] `shouldBe` [4, 3, ....] }'
    In a stmt of a 'do' block:
      it "returns the inversed list of the given list"
      $ do { myReverse [1, 2, ....] `shouldBe` [4, 3, ....] }

Итак, я сделал следующее изменение в тесте

myReverse [1 :: Int,2,3,4] `shouldBe` [4,3,2,1]

Есть ли другой способ избежать этого предупреждения, чем определить тип элемента списка?

4b9b3361

Ответ 1

Не с числовыми литералами. Поскольку литералы имеют тип Num a => a, и мы передаем его функции, которая полиморфна в a, нет никаких намеков относительно того, что разрешить a to.

Хорошей новостью является то, что именно так работают дефолты, и вам не о чем беспокоиться! Предупреждение раздражает, хотя, я могу думать о двух способах избежать этого.

  • Использовать явно выраженные подписи
  • Не используйте числовые литералы

2, вероятно, будет лучшим в вашем сценарии, мы знаем по типу, что тип элемента не может повлиять на его функцию, поэтому вы можете использовать Bool

 myReverse [True, False] `shouldBe` [False, True]

В стороне от вашей текущей реализации O(n^2) и O(n) возможно, я оставлю это вам, чтобы выяснить, как хотя:)