10

来週の関数型プログラミング試験の準備として、Haskellでポリモーフィック二分木を処理するための次のコードを作成しました。

data ITree t = Leaf | Node t (ITree t) (ITree t) 
             deriving (Eq, Ord, Show)

treeSum :: ITree t -> Int
treeSum Leaf = 0
treeSum (Node n t1 t2) = n + (treeSum t1) + (treeSum t2)

今、私はコードがコンパイルされないという問題を抱えています:

...\tree.hs:8:26:
Couldn't match type `t' with `Int'
  `t' is a rigid type variable bound by
      the type signature for treeSum :: ITree t -> Int
      at ...\tree.hs:7:1
In the first argument of `(+)', namely `n'
In the first argument of `(+)', namely `n + (treeSum t1)'
In the expression: n + (treeSum t1) + (treeSum t2)
Failed, modules loaded: none.
Prelude>

treeSumの何が問題になっているのか知っていますか?ポリモーフィックタイプのITreeと関係があると思いますが、これを解決する方法がわかりません。タイプtはカウント/列挙可能なタイプでなければならないことを指定する必要がありますか?おそらくそのような型クラスのクラスインスタンスで?

よろしくお願いします!

サイモン

4

1 に答える 1

11

コンパイラーは、結果がになることを確認できませんInttreeSum現状では、引数を使用して呼び出すことができITree Integerます(そして、操作はを生成しませんInt)。

署名をに変更してみてくださいtreeSum :: Integral t => ITree t -> t

于 2012-07-31T14:30:38.327 に答える