treemp函数做了什么,这里?

时间:2015-09-30 19:04:24

标签: haskell tree

treemp功能在做什么?输入和输出对应的是什么?

import Data.Word
import Data.Char
import Data.List


import System.Environment

data Tree a = Leaf a | Root a [Tree a] deriving (Eq, Show)

treemp f (Leaf a) = Leaf $ f a
treemp f (Root a ts) = Root (f a) $ map (treemp f) ts


t0 = Root 0 [t1,t2,t3,t4,t5]

t1 = Leaf 1

t2 = Root 2 [Leaf 6, Leaf 7, Root 11 [Leaf 12, Leaf 13]]

t3 = Root 3 [Leaf 8, Leaf 9]

t4 = Root 4 [Leaf 10]

t5 = Leaf 5

2 个答案:

答案 0 :(得分:1)

让我们从查看类型开始。

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

因此treemp f将函数f提升到Tree以上。对于列表类似于map,对于此fmap类型,Tree a类似。

我是如何计算出这种类型的?让我们看看第一种情况:

treemp f (Leaf a) = Leaf $ f a

我们知道(Leaf a)必须有Tree a类型。我们知道因为Leaf构造函数应用于参数,所以返回类型必须是Tree b。此外,我们知道f必须是一个可以将a作为参数的函数,并且它的返回类型必须与b匹配。所以f :: a -> b。我们可以将这些部件重新插入并重新使用上面提到的类型。该类型与fmap :: Functor f => (a -> b) -> f a -> f b的类型相匹配,因此我们知道必须将该函数提升为Tree a类型。

答案 1 :(得分:1)

我认为它是fmap的{​​{1}}定义。给定Tree,它会f :: a -> b应用于f中的每个aTree aLeaf,并递归到每个Root {1}}中的{1}},返回Tree