algorithm - Haskell 二叉树函数( map )

标签 algorithm haskell binary-tree

我如何定义一个 Haskell 函数,将函数应用于二叉树中的每个值?所以我知道它类似于 map 函数 - 它的类型是:

mapT :: (a -> b) -> Tree a -> Tree b

但仅此而已......

最佳答案

您可以声明类 Functor 的实例。这是允许映射函数的数据类型的标准类。请注意 fmap 的类型与您的 mapT 的类型有多相似:

class Functor f where
  fmap :: (a -> b) -> f a -> f b

假设您的树定义为

data Tree a = Node (Tree a) (Tree a) | Leaf a
  deriving (Show)

然后你可以这样声明一个Functor的实例:

instance Functor Tree where
  fmap f (Node l r) = Node (fmap f l) (fmap f r)
  fmap f (Leaf x) = Leaf (f x)

这是你如何使用它:

main = do
  let t = Node (Node (Leaf 1) (Leaf 2)) (Leaf 3)
  let f = show . (2^)
  putStrLn $ "Old Tree: " ++ (show t)
  putStrLn $ "New Tree: " ++ (show . fmap f $ t)

输出:

Old Tree: Node (Node (Leaf 1) (Leaf 2)) (Leaf 3)
New Tree: Node (Node (Leaf "2") (Leaf "4")) (Leaf "8")

为了方便也可以定义:

mapT = fmap

当然,您可以在没有类型类的情况下做到这一点,但如果您使用标准函数(每个人都知道 fmap 的通常行为),它会使代码对其他人更具可读性。

关于algorithm - Haskell 二叉树函数( map ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2756621/

相关文章:

algorithm - 最优二叉搜索树仅针对特定顺序的键和频率对是最优的?

c# - 从 List<object> 中查找多个唯一匹配项,其中两个条件必须不同

haskell - 在 Haskell 中,我如何获取一个 m 元谓词和一个 n 元谓词并构造一个 (m+n) 元谓词?

c - 如何在二叉树中搜索与给定值 x 的匹配项?

c - 如何将数字插入到 C 中的二叉搜索树中?

algorithm - 二叉树中从根到叶的节点数是多少

.net - 如何确定 .NET 中进度条的增量步骤?

haskell - Foldable.foldl 如何在 Num a => a 上工作

haskell - 我可以加速这个 Haskell 算法吗?

c++ - 在 STL 集上使用静态与成员查找方法?