gpt4 book ai didi

dictionary - 实现 mapTree 功能

转载 作者:行者123 更新时间:2023-12-04 17:20:35 25 4
gpt4 key购买 nike

我被要求定义函数:

treeMap :: (a -> b) -> BinaryTree a -> BinaryTree b

它接受一个函数和一个二叉树,并生成一个二叉树,其中所有节点都是在给定树上应用该函数的结果

二叉树是:
data BinaryTree a = Nil | BNode a (BinaryTree a) (BinaryTree a)

我的代码不符合。我收到以下错误:
error: Not in scope: data constructor ‘BinaryTree’
treeMap f (BNode x (BinaryTree l) (BinaryTree r)) = | ^^^^^^^^^^

我的代码:
data BinaryTree a = Nil | BNode a (BinaryTree a) (BinaryTree a)

treeMap :: (a -> b) -> BinaryTree a -> BinaryTree b
treeMap f Nil = Nil
treeMap f (BNode x (BinaryTree l) (BinaryTree r)) =
BNode (f x) (BinaryTree (treeMap f l)) (BinaryTree (treeMap f r))

最佳答案

您的图案 (BNode x (BinaryTree l) (BinaryTree r))不是有效的模式。事实上,二叉树的数据定义说:

data BinaryTree a = Nil | BNode a (BinaryTree a) (BinaryTree a)

所以这意味着 BNode是一个包含三个参数的数据构造函数。最后两个参数的类型是 BinaryTree a ,但您不能在模式匹配中使用类型。

因此你应该使用 lr作为这些参数的变量(或者您可以使用 BinaryTree a 类型的数据构造函数)。

构造 BinaryTree a 时也是如此类型。你用 BNode x l r 调用构造函数与 x , lr值,您没有在表达式中指定类型。您可以指定类型,然后使用 ::运算符(operator)。

因此,您可以使用以下方法修复您的代码:
treeMap :: (a -> b) -> BinaryTree a -> BinaryTree b
treeMap f Nil = Nil
treeMap f (BNode x l r) = BNode (f x) (treeMap f l) (treeMap f r)

或更优雅:
treeMap :: (a -> b) -> BinaryTree a -> BinaryTree b
treeMap f = go
where go Nil = Nil
go (BNode x l r) = BNode (f x) (go l) (go r)

话虽如此,你可以让 ghc导出 Functor 为您提供实例,通过使用 DeriveFunctor附注:
{-# LANGUAGE DeriveFunctor #-}

data BinaryTree a = Nil | BNode a (BinaryTree a) (BinaryTree a) deriving Functor
treeMap就是 fmap :: Functor f => (a -> b) -> f a -> f b f ~ BinaryTree这里。

关于dictionary - 实现 mapTree 功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56065204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com