我有一个数据类型:为什么我会遇到这些类型错误?
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)
但是,这是行不通的。
有什么不对?我使用的弗雷格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.
弗雷格[与常规哈斯克尔不同](https://github.com/Frege/frege/wiki/Differences-between-Frege-and-Haskell);我认为使用[tag:frege]标签而不是[tag:haskell]更合适。 – Zeta
您无法获取节点的深度。你只能得到它的高度(例如离树叶最远的距离)那么你想得到什么? – gen
@Zeta感谢您的编辑。如果他使用ghci,类型错误将会是同构的。但没关系,我们关心这一点。 :) – Ingo