如何查看haskell中typeClass函数的默认实现?

有如下这个例子:

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
                                
testTree = Node 5  
            (Node 3  
             (Node 1 Empty Empty)  
             (Node 6 Empty Empty)  
            )  
            (Node 9  
             (Node 8 Empty Empty)  
             (Node 10 Empty Empty)  
            )

对于 Tree 这个 instance 来说,我并没有定义 foldr 这个方法,但是,我在控制台中执行 F.foldr (+) 0 testTree 确可以得到 42 这个我想要的结果。那么在 F.Foldable 这个typeClass上应该是定义了 foldr 这个方法所以我才能在 instance 中未定义的情况下也能调用该方法吧,但是我使用 :info 命令去查看这个 typeClass 时只能查看到该 typeClass 所有的函数的类型,确无法看到默认实现,有什么办法可以得知默认实现呢?

阅读 2.8k
1 个回答

hakell 绝大多数代码就是 hashell 实现的,所以你可以看源码:

foldr :: (a -> b -> b) -> b -> t a -> b
foldr f z t = appEndo (foldMap (Endo #. f) t) z

https://github.com/ghc/ghc/bl...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进