Я работаю через онлайн Книга (ссылка приведет вас прямо к разделу, что мой вопросы вопросов).
Автор определяет тип данных бинарного дерева, и показывает, как его можно сделать экземпляр складного типа (определено в Data.foldable) путем реализации функции складки:
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
Декларация типа Foldmap выглядит следующим образом:
F.foldMap :: (Monoid m, F.Foldable t) => (a -> m) -> t a -> m
Так что требуется функция, которая принимает экземпляр типа «A» и возвращает моноид.
Теперь, в качестве примера, автор создает экземпляр дерева
testTree = Node 5
(Node 3
(Node 1 Empty Empty)
(Node 6 Empty Empty)
)
(Node 9
(Node 8 Empty Empty)
(Node 10 Empty Empty)
)
и выполняет следующую складку (определено для складываемых типов):
F.foldl (+) 0 testTree -- the answer is 42 (sum of the Node Integers)
Мой вопрос в том, как Haskell определяется, что дополнение к целочисленному типу - Запрос Haskell Для типа TestTree дает дерево [целое число] - можно рассматривать как моноидную работу (если моя терминология верна)?
(Моя собственная попытка ответа: автор Несколько абзацев до этого раздела описывает, как тип NUM можно интерпретировать в виде моноида в виде двух разных способов; путем упаковки Их в SUM и Продукт Тип Тип с (+) и (*) как MapPend функции и 0 и 1 в качестве MEMPTY Элемент соответственно. Тип «A» в ( дерева a) как-то выводится в том, что принадлежат к типу , типа (способ, которым Haskell по-прежнему интерпретирует числовые значения в соответствии с контекстом) Или это что-то другое полностью?]