【发布时间】:2011-11-12 14:55:40
【问题描述】:
我正在阅读在线LYAH 书籍(该链接会将您直接带到我的问题所涉及的部分)。
作者定义了一个二叉树数据类型,并展示了如何通过实现 foldMap 函数使其成为 Foldable 类型的实例(在 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”的实例并返回一个幺半群。
现在作为一个例子,作者创建一个Tree实例
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 如何计算出 Integer 类型的加法 - 查询 Haskell 的 testTree 类型给出 Tree [Integer] - 可以被视为一个幺半群运算(如果我的术语是正确的)?
(我自己的答案尝试:作者在本节前几段描述了 Num 类型如何以两种不同的方式解释为 Monoid 类型;通过将它们包装到 Sum 和 Product 类型中,其中 (+) 和 (*) 作为 mappend 函数,0 和 1 作为 mempty 元素。是否 (Tree a) 中的“a”类型以某种方式被推断为属于 Sum 类型(Haskell 的不同方式根据上下文解释数值)还是完全不同?]
【问题讨论】: