9

Si tengo una Haskell ADT tales como:nombres ADT. ¿Qué es `Left a`, y luego, ¿qué es` a` en Haskell?

data Foo 
= A Int Double 
| B Bool [Integer] 
| C (Maybe String) Float 

la A, B, y C se denominan constructores de datos; y a veces como constructores de valores . Pero, ¿cuál es el nombre correcto para:

  1. a "row/alternative": p. B Bool [Integer]; y
  2. un "campo/elemento" de una "fila/alternativa": p. el Double en A, o el [Integer] en B?
+1

Creo que te describes 'B: Bool -> [entero] -> foo' como el constructor y su tipo. 'Bool' y' [Integer] 'serían sus argumentos y p. '[Integer]' sería un único parámetro o argumento. Pero no estoy seguro de si estos son los nombres generalmente aceptados. – nobody

+0

Según lo que he visto, "campos" es el término correcto. "Parámetro" o "argumento" solo se usa cuando en realidad * se está construyendo *. – Nate

+0

Supongo que normalmente no siento la necesidad de referirme a esas cosas. Por lo general, es suficiente hacer referencia al "constructor C" o al "tipo Foo". ¿Tiene un ejemplo de oración de relleno en blanco en la que desea referirse a estas cosas? (Quizás los contestadores aceptarían el desafío de usar estos términos de manera significativa en una oración.) –

Respuesta

3
data Foo = A Int Double 
    ^^ Type Constructor "data Foo" 
     ^value Constructor "A" 
      ^^ Component "Int" and "Double" 

A | B generalmente se conoce como alternativas o casos. Perdón por el diablo.

Source: Real World Haskell ch3

+0

El informe Haskell también usa "componente", por lo que se ve bien para Q2. También veo "definición de constructor" allí, lo que parece correcto para Q1. – user2023370

11

leer la Sección 4.2 del Informe Haskell98 (http://www.haskell.org/onlinereport/decls.html):

  1. Esto no se explica de forma explícita, pero B Bool [Integer] es probablemente lo más correctamente se llama una "declaración del constructor" (por el constructor llamado B)
  2. Las cosas como Double en A se llaman declaraciones de campo (aunque llamarlo simplemente un campo debería estar bien también).
+0

Gracias Sumudu. Al mirar hacia allí, solo puedo ver la "definición de constructor", y es lo mismo en el [informe Haskell 2010 - Sección 4.2] (http://www.haskell.org/onlinereport/haskell2010/haskellch4.html#x10-680004.2). En cuanto a "campo", parece que * solo * se usa cuando se discute la sintaxis del registro en particular; y ahí están "campos etiquetados" o "etiquetas de campo". "Componente" se usa en la misma página y creo que podría ser correcto. – user2023370

+0

Bastante justo. Estaba extrapolando "declaración de campo" del nombre utilizado en la especificación de sintaxis que es "fielddecl". No parece haber un nombre totalmente definitivo (IMO cuando usan "componente" es más una descripción que nombrarlo). –

+0

Acepto, es más como una descripción. Por cierto, "fielddecl" en la especificación de sintaxis también se refiere solo a la sintaxis del registro. – user2023370