作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我被要求定义函数:
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
,但您不能在模式匹配中使用类型。
l
和
r
作为这些参数的变量(或者您可以使用
BinaryTree a
类型的数据构造函数)。
BinaryTree a
时也是如此类型。你用
BNode x l r
调用构造函数与
x
,
l
和
r
值,您没有在表达式中指定类型。您可以指定类型,然后使用
::
运算符(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/
我被要求定义函数: treeMap :: (a -> b) -> BinaryTree a -> BinaryTree b 它接受一个函数和一个二叉树,并生成一个二叉树,其中所有节点都是在给定树上应用
这是“Haskell Programming from first principles”第 11 章代数数据类型中的一道题: data BinaryTree a = Leaf | Node
我是一名优秀的程序员,十分优秀!