Hola,
Los dos tipos son el mismo, porque la flecha asocia a la derecha, entonces es lo mismo poner:
mapHT :: (a → b) → (HTree a → HTree b)
que:
mapHT :: (a → b) → HTree a → HTree b
y su lectura puede ser tanto como que toma un función y un HTree y retorna un HTree, como que toma una función y retorna una función de HTree en HTree.
Lo mismo pasa con el map, donde también podemos decir que el tipo es:
map :: (a → b) → ([a] → [b])
Para entender mejor el concepto, te recomiendo repasar en el teórico de "Polimorfismo, Sobrecarga y Alto Orden" la parte de "Funciones Currificadas".
saludos
Los dos tipos son el mismo, porque la flecha asocia a la derecha, entonces es lo mismo poner:
mapHT :: (a → b) → (HTree a → HTree b)
que:
mapHT :: (a → b) → HTree a → HTree b
y su lectura puede ser tanto como que toma un función y un HTree y retorna un HTree, como que toma una función y retorna una función de HTree en HTree.
Lo mismo pasa con el map, donde también podemos decir que el tipo es:
map :: (a → b) → ([a] → [b])
Para entender mejor el concepto, te recomiendo repasar en el teórico de "Polimorfismo, Sobrecarga y Alto Orden" la parte de "Funciones Currificadas".
saludos