Mientras lee el QuickCheck Manual, me encontré con el siguiente ejemplo:escribe declaraciones en 'donde' - ¿qué está pasando?
prop_RevRev xs = reverse (reverse xs) == xs
where types = xs::[Int]
El manual pasa a decir:
propiedades deben tener tipos monomorfas. Las propiedades `Polimórficas ', como la de arriba, deben estar restringidas a un tipo particular que se utilizará para las pruebas. Es conveniente hacerlo indicando los tipos de uno o más argumentos en un
donde tipos = (x1 :: t1, t2 :: x2, ...) Cláusula
. Tenga en cuenta que los tipos no son palabras clave; esto es solo una declaración local que proporciona un lugar conveniente para restringir los tipos de x1, x2, etc.
Nunca antes había visto un truco semejante en Haskell. Esto es lo que realmente tengo problemas con:
¿Por qué existe esta sintaxis para las declaraciones de tipo? ¿Qué puede hacer por mí que el siguiente no podría?
prop_RevRev :: [Int] -> Bool prop_RevRev xs = reverse (reverse xs) == xs
¿Este uso de
where
constituyen la sintaxis 'especial' para las declaraciones de tipo? ¿O es consistente y lógico (y si es así, cómo?)?¿Es este uso Haskell estándar o convencional?
Me he estado preguntando sobre esto durante mucho tiempo también. Gracias. – sykora
@MattFenwick: Puede agregar una anotación de tipo a cualquier subexpresión en cualquier nivel, por lo que este truco es útil cuando solo desea completar los detalles que el compilador no pudo inferir, sin tener que especificar la firma de tipo completo. Sin embargo, aún deben ser consistentes, p. '(x :: Float) + (x :: Int)' dará como resultado un tipo de error. – hammar
así que básicamente el 'tipo' o' tipos' es una variable ficticia que no se usa; solo para facilitar el tipo de protección en la otra expresión – newacct