Sto lavorando attraverso il libro online LYAH (il collegamento ti porterà direttamente alla sezione che riguarda la mia domanda).Questa inferenza di tipo Haskell è in azione o qualcos'altro?
L'autore definisce un tipo di dati albero binario, e mostra come può essere fatto un'istanza del tipo pieghevole (definito in Data.Foldable) implementando la funzione 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
Il tipo di dichiarazione foldMap è la seguente:
F.foldMap :: (Monoid m, F.Foldable t) => (a -> m) -> t a -> m
quindi prende una funzione che prende un'istanza di tipo "a" e restituisce un monoide.
Ora, come ad esempio, l'autore crea un'istanza albero
testTree = Node 5
(Node 3
(Node 1 Empty Empty)
(Node 6 Empty Empty)
)
(Node 9
(Node 8 Empty Empty)
(Node 10 Empty Empty)
)
e svolge le seguenti piega (definito per i tipi di pieghevoli):
F.foldl (+) 0 testTree -- the answer is 42 (sum of the Node Integers)
La mia domanda è, come fa Haskell capire quell'aggiunta al tipo Integer - l'interrogazione di Haskell per il tipo di testTree da Tree [Intero] - può essere vista come un'operazione monoid (se la mia terminologia è corretta)?
(La mia tentativo di risposta: L'autore alcuni paragrafi prima di questa sezione viene descritto come il Num tipo può essere interpretato come un Monoide tipo in due modi diversi, avvolgendoli nel Somma e prodotto tipo con (+) e (*) come mappend funzioni e 0 e 1 come elemento mempty, rispettivamente. è il tipo di "a" in (Albero a) essendo in qualche modo dedotto come appartenenti al tipo Sum (il modo in cui Hask ell variamente interpreta valori numerici in base al contesto) o è qualcos'altro interamente? ]
Bella spiegazione. "AppEndo" suona come un incantesimo di Harry Potter. –
@Dan Burton: Infatti. Non sei l'unica persona [a riguardo] (http://contemplatecode.blogspot.com/2011/04/haskell-weekly-news-issue-176.html), sia. –
sai, il mio cervello probabilmente ha collegato appEndo con Potter proprio a causa di quel HWN, che avevo dimenticato di aver letto. Non ho capito al momento; ora ho un'idea migliore di cosa 'appEndo' effettivamente fa :) –