【发布时间】:2016-02-11 01:42:55
【问题描述】:
我有一个数据类型:
data Tree = Empty | Node Int Tree Tree
我想要功能
nodeDepth :: Tree -> [(Int, Int)]
每个节点一对。第一个元素是标签(值),第二个是它的深度。
我的意图(原始代码)是这样的:
nodeDepth (Node label left right) = zip nodeDepth' (Node label left right) [0]
nodeDepth' Empty _ = []
nodeDepth' (Node label left right) [level] = label : nodeDepth' (Node label left right) level : (1 + level)
但这不起作用。
怎么了?我正在使用 Frege REPL
Error message are like :
E <console>.fr:22: t19906 occurs in type [t19906] rendering expression level{19727} untypable.
E <console>.fr:22: type error in expression level
type is t19906
used as [t19906]
E <console>.fr:22: type error in expression
nodeDepth' (Node label left right) level:+ 1 level
type is [[t19909]]
used as [Int]
E <console>.fr:22: [[Int]] is not an instance of Num
E <console>.fr:20: type error in expression nodeDepth'
type is apparently [t19961]
used as function
H <console>.fr:20: too many or too few arguments perhaps?
E <console>.fr:20: type error in expression Node label left right
type is Tree
used as [t19964]
E <console>.fr:20: type error in expression
zip nodeDepth' (Node label left right)
type is apparently [(t19961,t19964)]
used as function
H <console>.fr:20: too many or too few arguments perhaps?
W <console>.fr:20: application of nodeDepth will diverge.
【问题讨论】:
-
弗雷格differs from regular Haskell;我认为使用frege 标签而不是haskell 更合适。
-
无法获取节点的深度。你只能得到它的高度(例如离树叶最长的距离)那么你想要得到什么?
-
@Zeta 感谢您的编辑。如果他使用 ghci,类型错误将是同构的。但没关系,我们关心这个。 :)
-
@Zeta 我认为添加 Haskell 标签是值得的,因为这个问题中出现的问题对于 Haskell 来说也是一样的,而标签 frege “限制”了问题的公开性。