所以我有以下树状数据结构:
data Tree = Node (Int -> Int) Int [Tree]
基本上,每个节点都包含一个标签函数(Int -> Int)
,一个标签Int
和一个子树列表。现在我想编写一个函数,当给定Tree和Int时,找到一个函数,它将使用给定的输入产生最大的输出。
如果我应用该功能,我能够找到最大的输出,但我似乎无法找到相关的功能。
tmax :: Int -> Tree -> Int
tmax l (Node func _ []) = func l
tmax l (Node func _ xs) = max (func l) $ maximum $ map (tmax l) xs
这给了我应用于l。
时可以由任何函数产生的最大输出预期功能的一些例子:
t2 = Node (+1) 1 [Node (+5) 2 [], Node (-3) 7 [], Node (\x -> x*x) 4 []]
(+1) 1
/-------|-------\
(+5) 2 (-3) 7 (\x -> x*x) 4
因此,如果我申请tmax 4 t2
,答案将是(\x -> x*x)
,因为这会带来最大的输出。如果我要执行tmax 2 t2
,则输出将为(+5)
,因为那样会产生最大输出。然而,我当前的功能只能提供最大的价值,而不是功能。所以对于第一个例子,它将传递16,而第二个例子为7。
谢谢!
答案 0 :(得分:1)
这里有一个提示。首先写一个二进制最大值。
bmax :: Int -> Tree -> Tree -> Tree
bmax l t1@(Node f1 _ _) t2@(Node f2 _ _) | f1 l > f2 l = t1
| otherwise = t2
然后,使用递归计算所有子树的最大值。您可以使用折叠作为子树列表。
答案 1 :(得分:1)
好吧,我能够通过编写自己的maximum
和max
实现来实现它,这样它们就会返回函数而不是值。然后一切正常,谢谢!