Podemos usar sinónimo de tipo para definiciones de funciones, p. Ej.Ejemplo de definición de función en el constructor de datos de un nuevo tipo
type FuncDef = Int -> Int -> Int
Esto nos evita escribir una definición de función larga cada vez.
Uso:
someFunc :: FuncDef -> Int
En lugar de
someFunc :: (Int -> Int -> Int) -> Int
que es más fácil de leer y menos código.
Los tipos de datos algebraicos simples son simples y directos, etc.
data AType = X | Y | Z Int
matchType :: AType -> Bool
matchType X = ..
matchType Y = ..
matchType (Z _) = ..
Al mirar más en tipos de datos de Haskell, descubrí que podemos tener en la definición de la función constructor de datos en la definición de nuevo tipo.
data MyType a b = X | Y (a -> b)
Esto me desconcierta un poco y no he visto muchos ejemplos de esto. En cierto modo, la idea de función de orden superior en la que una función puede tomar otra función como argumento es similar a esta situación, excepto que aquí se aplica al tipo de datos. La wiki de Haskell no dice mucho sobre "definición de tipos de datos de alto orden". Me doy cuenta de que puedo estar equivocando todos estos términos, así que por favor corrígeme, y apúntame a leer más. Realmente quiero ver un uso concreto de esto. ¡Gracias!
matchMyType :: (MyType a b) -> Bool
matchMyType X = ..
matchMyType Y ?? = ..
Creo que es posible que te preocupes demasiado! Como dices, las funciones se pueden pasar como argumentos. Eso es porque las funciones no son intrínsecamente diferentes de cualquier otro valor. Puede ponerlos en un tipo de datos y extraerlos por coincidencia de patrones. Eso es todo lo que hay que hacer. –
gracias +1, tiene sentido lo que dijiste. ¿Me puede dar un ejemplo en el que me gustaría poner una función en una estructura de datos en lugar de simplemente valores, p. enteros en un árbol? – vis
Bueno, la mayoría de los usos prácticos que puedo pensar para los tipos de datos que contienen funciones son más complicados y probablemente solo lo distraigan del problema. Si desea un ejemplo genérico, la respuesta de dave4420 le irá bien. Si quiere algo más difícil de considerar, el ejemplo obligatorio es probablemente el [transformador de mónada de estado] (http://hackage.haskell.org/packages/archive/transformers/latest/doc/html/Control-Monad-Trans-State -Lazy.html # g: 2). –