3

HaskellでTreeデータ型を定義し、ツリー内の要素の数を計算する関連する「size」メソッドを定義しました。これは以前は機能していましたが、次の定義のように名前付きフィールドを使用するようにTreeデータ型を更新しました。

data Tree a = Empty
 | Leaf {value::a}
 | Node {left :: (Tree a), value :: a, right :: (Tree a)}
 deriving (Eq, Ord, Show)

たとえば、関数(左n)を使用して、名前付きフィールドにアクセスできることがわかりました(GHCiで遊んでみました)。ただし、この関数を使用しようとすると、エラーが発生します。

size :: Tree a -> Int
size Empty    = 0
size (Leaf l)   = 1
size (Node n)   = size (left n) + 1 + size (right n)

GHCiは単に「範囲外:左」と言い、右に相当します。Tree定義はTreeというモジュールにあり、サイズ定義はMainというモジュールにありますが、名前のないフィールドでは、Treeデータ型から変数にアクセスするときにスコープに問題が発生することはありませんでした。

4

1 に答える 1

7

パターンsize (Node n)には正しいコンストラクターが必要です。コードnで左側の要素を抽出します。

これを試してください(名前付きパターンを本当に使用したい場合):

size n@(Node _ _ _)   = size (left n) + 1 + size (right n)

あるいは:

size n@(Node {})   = size (left n) + 1 + size (right n)

または、パターン内のラベルを抽出できます。

size (Node {left=l, right=r})   = size l + 1 + size r

または単にラベルを無視します:

size (Node l _ r)   = size l + 1 + size r
于 2010-02-09T12:21:46.143 に答える