我想将我的数据类型 Exp 转换为一个映射,其中函数名称(加、减等)是键,值是它们在表达式中出现的次数。这是我的数据声明:
data Exp = Number Int
| Add Exp Exp
| Subtract Exp Exp
| Multiply Exp Exp
| Divide Exp Exp
deriving Show
我可以用 BST 来解决这个问题,但我似乎无法用不同的数据类型来完成这个任务。如果有帮助,这是我的 BST 解决方案:
import Data.Map
data Tree a = Empty | Node a (Tree a) (Tree a) deriving (Show)
leaf x = Node x Empty Empty
foldt :: (a -> b -> b) -> b -> Tree a -> b
foldt f a Empty = a
foldt f a (Node x xl xr) = f x ar
where al = foldt f a xl
ar = foldt f al xr
insert' :: Ord a => a -> Map a Int -> Map a Int
insert' a = insertWith (+) a 1
toMap :: Ord a => Tree a -> Map a Int
toMap = foldt insert' empty
完成上述程序后似乎应该很简单,但我什至不知道从哪里开始。注意:我想尽可能多地使用递归。提前致谢!