2011-05-08 33 views
34

Veo y uso los símbolos ::en todas partes pero sigo sin saber qué significa el símbolo :: al programar en Haskell, p. Ej.¿Qué significa :: (doble colon) en Haskell?

run :: Int -> Int -> Int 
-- ?? 

¿Qué :: (dos puntos dobles) reposar en Haskell?

+11

Significa * tiene tipo *, por lo que ejecutar tiene tipo Int -> Int -> Int. ¿Cómo crees que puedes leer los programas de Haskell sin siquiera saber conceptos, símbolos y conceptos básicos del lenguaje? Algunas veces * es * una buena idea leer una referencia de lenguaje, y Haskell tiene una muy buena. – Ingo

+0

Gracias @Ingo ¿dónde podría encontrar esa referencia? – maclunian

+2

Su punto de partida es siempre haskell.org. El Informe Haskell 2010 está aquí: http://haskell.org/definition/haskell2010.pdf – Ingo

Respuesta

29

Puede buscar en Google haskell "double colon" o cosas similares; desafortunadamente es un poco difícil buscar la sintaxis de google, pero en este caso puedes nombrarlo.

En Haskell, sus programas a menudo funcionarán bien sin él (aunque querrá usarlo para perfeccionar la especificación de las funciones que defina, y es una buena práctica).

La idea es que puede insertar un :: ... en cualquier lugar (incluso en el medio de una expresión) para decir "por cierto Mr. Compiler, esta expresión debe ser del tipo ...". El compilador lanzará un error si se puede probar que este no es el caso.

Creo que también puede usarlo para "emitir" funciones a las versiones que desee; p.ej. si una función es "polimórfica" (tiene una firma de tipo general) y realmente desea, digamos un Integer, entonces podría hacer :: Integer en el valor resultante tal vez; Aunque estoy un poco oxidado.

+0

También tiene casos más complicados de polimorfismo, donde no desea describir un tipo específico, el tipo de un tipo; especificar tipo funciona incluso con polimorfismo ordinario. –

+18

Ese es exactamente el término de búsqueda que me trajo aquí ... –

+0

¿De dónde viene esta notación? ¿Está basado en las matemáticas? – ApproachingDarknessFish

11

Se debe leer:

foo :: a 

como "el nombre foo es un valor de tipo a". Cuando se escribe:

run :: a -> b 

esto significa:

  1. está declarando el nombre run.

  2. Este nombre se referirá a un valor que tiene tipo a -> b,

El tipo a -> b es el tipo de una función que toma un valor de tipo a y devuelve otro valor de tipo b.

Realmente debe aprender sobre los tipos para entender Haskell. El sistema de tipos es una de las características más importantes de Haskell, y es lo que hace que el lenguaje sea tan expresivo.

6

Cuando tiene un gran error de verificación de tipo de aspecto aterrador, puede (temporalmente) envolver partes de su código en (myexpression :: MyType) para indicar explícitamente al compilador qué tipo espera que myexpression tenga. Esto a menudo ayudará al compilador a darle mejores mensajes de error.

Cuestiones relacionadas