我是Haskell的新手,目前正在研究折叠和展开及其类型声明。我很难理解这种类型声明的含义:
foldT :: (u -> u -> u) -> (a -> u) -> Tree a -> u
任何帮助都将受到高度赞赏!
答案 0 :(得分:2)
将其分解成小部分可能更容易。
在伪Haskell中,签名是
foldT :: some-function-x -> some-function-y -> Tree a -> u
,名称为foldT
,因此可能是"总结"单个结果中的所有树。也可以安全地猜测Tree a
表示一个树的节点'值的类型为a
。
因此foldT
需要some-function-x
,some-function-y
,Tree a
,并Tree a
总结u
。
我们如何总结一棵树?据推测,我们可以递归到每个叶子,并汇总a
我们遇到的每个u
值。在递归中回溯,内部节点现在只在其后代(可能是其自身)中看到u
值,并且它必须将它们汇总为单个u
。
实际上,some-function-x
的类型为(u -> u -> u)
,即内部节点用来汇总两个u
值的函数,some-function-y
的类型为{{1}这是一个用(a -> u)
值总结节点值的函数。
示例强>
假设u
是a
,因此树是String
s的树。此外,折叠的目的是总结"树通过计算存储在其中的字符串的总长度。然后
String
可能是u
Int
可能是length
- 它汇总了各个字符串。
some-function-y
可以是some-function-x
- 它会将两个摘要汇总为一个摘要。