Estoy trabajando en el libro en línea LYAH (el enlace lo llevará directamente a la sección que me interesa).¿Es esta inferencia tipo Haskell en acción, o algo más?
el autor define un binario tipo de datos del árbol, y muestra cómo se puede hacer una instancia del tipo plegable (definido en Data.Foldable) mediante la implementación de la función foldMap:
import Data.Monoid
import qualified Data.Foldable as F
data Tree a = Empty | Node a (Tree a) (Tree a) deriving (Show, Read, Eq)
instance F.Foldable Tree where
foldMap f Empty = mempty
foldMap f (Node x l r) = F.foldMap f l `mappend`
f x `mappend`
F.foldMap f r
la declaración de tipo de foldMap es como sigue:
F.foldMap :: (Monoid m, F.Foldable t) => (a -> m) -> t a -> m
así que lleva una función que toma una instancia de tipo "a" y devuelve un monoide.
Ahora, como un ejemplo, el autor crea una instancia de árbol
testTree = Node 5
(Node 3
(Node 1 Empty Empty)
(Node 6 Empty Empty)
)
(Node 9
(Node 8 Empty Empty)
(Node 10 Empty Empty)
)
y realiza las siguientes veces (definida para este tipo plegable):
F.foldl (+) 0 testTree -- the answer is 42 (sum of the Node Integers)
Mi pregunta es, ¿cómo averiguar Haskell esa adición sobre el tipo Integer - consultar Haskell para el tipo de testTree da Tree [Integer] - se puede ver como una operación monoid (si mi terminología es correcta)?
(Mi propio intento de la respuesta: El autor de algunos párrafos anteriores a esta sección se describe cómo el Num tipo puede ser interpretado como un Monoid tipo de dos maneras diferentes; envolviéndolos en el Suma y Producto tipo con (+) y (*) como los mappend funciones y 0 y 1 como el elemento mempty, respectivamente. Es el tipo de "a" en (árbol a) de alguna manera se infiere como pertenecientes al Suma tipo (la forma Hask ell interpreta diversos valores numéricos de acuerdo con el contexto) o es algo totalmente diferente? ]
Buena explicación. 'appEndo' suena como un hechizo de Harry Potter. –
@ Dan Burton: De hecho. No eres la única persona que [comenta sobre eso] (http://contemplatecode.blogspot.com/2011/04/haskell-weekly-news-issue-176.html) tampoco. –
ya sabes, mi cerebro probablemente vinculó a la aplicación con Potter precisamente por ese HWN, que había olvidado que había leído. No entendí en ese momento; ahora tengo una mejor idea de lo que 'appEndo' realmente hace :) –