我正在通過在線LYAH書(該鏈接將直接轉到我的問題所關注的部分)。這是Haskell類型推斷的行動,還是別的?
的作者定義的二進制樹的數據類型,並且示出了它如何可製成型摺疊(在Data.Foldable定義)的一個實例,通過實施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
的類型聲明foldMap如下:
F.foldMap :: (Monoid m, F.Foldable t) => (a -> m) -> t a -> m
所以它需要一個函數,它需要一個類型爲「a」的實例並返回一個monoid。
現在,作爲一個例子,作者創建一個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] - 可以看作是一個monoid操作(如果我的術語是正確的)?
(我自己的答案嘗試:筆者本節之前的幾段描述民類型如何,可以解釋爲兩種不同的方式含半幺羣類型;通過包裝他們進入總和和產品型與(+)和(*)作爲mappend功能和在0和1作爲mempty元件,分別是「A」中(樹一個)以某種方式被推斷爲屬於的類型到總和類型(哈斯克的方式埃爾根據上下文不同地解釋數值)還是完全不同? ]
很好的解釋。 'appEndo'聽起來像是哈利波特的咒語。 –
@丹伯頓:的確。你不是唯一一個[評論](http://contemplatecode.blogspot.com/2011/04/haskell-weekly-news-issue-176.html)的人。 –
你知道,我的腦子可能正是因爲那個HWN,我忘記了我讀過的那個HWN把appEndo和Potter聯繫起來了。我當時不明白;現在我對'appEndo'實際上有什麼更好的瞭解:) –