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
答案 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
中的每个a
(Tree a
和Leaf
,并递归到每个Root
{1}}中的{1}},返回Tree