объявления типа в 'where' - что происходит?

При чтении QuickCheck В руководстве я наткнулся на следующий пример:

prop_RevRev xs = reverse (reverse xs) == xs
  where types = xs::[Int]

В руководстве говорится:

Свойства должны иметь мономорфные типы. «Полиморфные» свойства, такие как указанное выше, должны быть ограничены конкретным типом, который будет использоваться для тестирования. Это удобно сделать, указав типы одного или нескольких аргументов в

, где types = (x1 :: t1, x2 :: t2, ...)

. Обратите внимание, что типы - это не ключевое слово; это просто локальное объявление, которое предоставляет удобное место для ограничения типов x1, x2 и т. д.

Я никогда раньше не видел такого трюка в Haskell. Вот с чем у меня действительно проблемы:

  1. Почему вообще существует этот синтаксис для объявлений типов? Что может сделать для меня то, что следующее не может?

     prop_RevRev :: [Int] -> Bool 
    prop_RevRev xs = reverse (reverse xs) == xs 
     
  2. Есть это использование , где составляют «специальный» синтаксис для объявлений типов? Или это непротиворечиво и логично (и если да, то как?)?

  3. Является ли это стандартным или обычным Haskell?

14
задан Matt Fenwick 3 May 2012 в 15:04
поделиться