При чтении QuickCheck В руководстве я наткнулся на следующий пример:
prop_RevRev xs = reverse (reverse xs) == xs
where types = xs::[Int]
В руководстве говорится:
Свойства должны иметь мономорфные типы. «Полиморфные» свойства, такие как указанное выше, должны быть ограничены конкретным типом, который будет использоваться для тестирования. Это удобно сделать, указав типы одного или нескольких аргументов в
, где types = (x1 :: t1, x2 :: t2, ...)
. Обратите внимание, что типы - это не ключевое слово; это просто локальное объявление, которое предоставляет удобное место для ограничения типов x1, x2 и т. д.
Я никогда раньше не видел такого трюка в Haskell. Вот с чем у меня действительно проблемы:
Почему вообще существует этот синтаксис для объявлений типов? Что может сделать для меня то, что следующее не может?
prop_RevRev :: [Int] -> Bool
prop_RevRev xs = reverse (reverse xs) == xs
Есть это использование , где
составляют «специальный» синтаксис для объявлений типов? Или это непротиворечиво и логично (и если да, то как?)?
Является ли это стандартным или обычным Haskell?