Haskell类型声明解释折叠?

时间:2017-05-09 23:39:22

标签: haskell

我是Haskell的新手,目前正在研究折叠和展开及其类型声明。我很难理解这种类型声明的含义:

foldT :: (u -> u -> u) -> (a -> u) -> Tree a -> u

任何帮助都将受到高度赞赏!

1 个答案:

答案 0 :(得分:2)

将其分解成小部分可能更容易。

在伪Haskell中,签名是

foldT :: some-function-x -> some-function-y -> Tree a -> u

,名称为foldT,因此可能是"总结"单个结果中的所有树。也可以安全地猜测Tree a表示一个树的节点'值的类型为a

因此foldT需要some-function-xsome-function-yTree a,并Tree a总结u

我们如何总结一棵树?据推测,我们可以递归到每个叶子,并汇总a我们遇到的每个u值。在递归中回溯,内部节点现在只在其后代(可能是其自身)中看到u值,并且它必须将它们汇总为单个u

实际上,some-function-x的类型为(u -> u -> u),即内部节点用来汇总两个u值的函数,some-function-y的类型为{{1}这是一个用(a -> u)值总结节点值的函数。

示例

假设ua,因此树是String s的树。此外,折叠的目的是总结"树通过计算存储在其中的字符串的总长度。然后

  • String可能是u

    • Int可能是length - 它汇总了各个字符串。

    • some-function-y可以是some-function-x - 它会将两个摘要汇总为一个摘要。