2011-05-04 23 views
5

Estoy realmente confundido acerca de cómo se supone que debes obtener datos de las clases de tipos en haskell. Estoy buscando un fondo C, por lo que es muy difícil que no puedas acceder a los datos. Lo que tengo es algo como esto:Creación de listas de tipos de datos en Haskell

data MyType = MyType String deriving (Show) 


display :: [MyType] -> IO() 
display ((MyType name):xs) = do 
     display xs 
     putStr name 

Básicamente aquí quiero acceder a 'nombre', sin embargo, simplemente no parece funcionar. ¿Puedo acceder a los datos dentro de una instancia de una clase de letra simplemente haciendo una referencia al objeto en mi código o tengo que asignar su contenido a las variables? y si es así, ¿cómo?

Los enlaces a buenos tutoriales sobre esto se agradecerán, he leído 'Aprende Haskell para siempre', pero cuando trato de desviarme de los ejemplos dados, siempre parece haber mucho que necesito saber para obtener Está hecho. -A

Respuesta

6

Creo que es posible que le falten algunas piezas pequeñas que lo atan todo junto.

En primer lugar, usted tiene un tipo perfectamente bien los datos, MyType, que contiene cadenas:

data MyType = MyType String deriving (Show) 

Ahora, que desea escribir una función que recorre una lista de este tipo, la impresión de cada elemento a medida que avanza. Hacemos esto a través de la recursión sobre el tipo de datos de la lista.

Dado que las listas tienen dos casos, la lista vacía, [], y el caso contras, (:), tenemos dos ramas:

display :: [MyType] -> IO() 
display []     = return() 
display ((MyType name):xs) = do 
     putStrLn name 
     display xs 

Ahora, en el que cree que puede tener ir pegado fue la construcción de algunos datos de este tipo. Ya sabes cómo desmontarlo con la coincidencia de patrones, y construyes los datos usando casi la misma sintaxis. He aquí una lista de MyType:

table = 
    [ MyType "john" 
    , MyType "don" 
    , MyType "eric" 
    , MyType "trevor" 
    ] 

Por último, puede ejecutar el programa desde main

main = display table 

Nota, no hay clases de tipos aquí, sólo tipos de datos algebraica (introducido con data).

+0

¿Qué pasa con tener una función que agrega dinámicamente MyType s a la lista. Imagine una función que procesa algo y tomo algunas cadenas que convierto en MyType y las tengo que agregar a una lista global de MyTypes, ¿cómo puedo hacer eso? –

1

Antes que nada, estoy un poco confundido acerca de las palabras que usa. Una clase de tipo es una forma de sobrecargar funciones. Lo que tiene es un tipo de datos algebraicos . El problema que tienes (si lo entendí correctamente) es bien conocido. A los efectos de acceder a los datos más fácil, se puede usar la sintaxis de registro :

data Foo = Foo { 
    bar :: Int 
    , baz :: String 
} 

ve usted la similitud con una estructura en C? Utilizando la sintaxis de registro, hay algunas cosas interesantes posible:

bar y -- access member bar of y 
y { bar = z } -- Make a new record but with field bar changed to the value of z 

y alguna otra cosa también.

+0

La sintaxis de registro se aparta de la sintaxis de C struct porque cada campo da lugar a una función del mismo nombre para extraer ese campo de una instancia del tipo de datos. En el caso anterior, obtendrá 'bar :: Foo -> Int' y' baz :: Foo -> String'. Como resultado, no puede crear otro registro en el mismo módulo con campos llamados 'bar' o' baz' ya que no puede tener más de un tipo para la función resultante. – pat

Cuestiones relacionadas