(Tree a) - >(Tree a) - >(Tree a)という関数を実装しようとしています。この関数はノード値を合計してその合計を持つツリーを返すべきです。不幸なことに私は次のエラーメッセージが出ました。
Aufgabe10.hs:4:11: 予期しないタイプ「Tree a」 「+」のクラス宣言で クラス宣言は次の形式を取ります class + a b cここで...
これは私のコードです:
data Tree a = Node a (Tree a) (Tree a)
|Empty
class (+) (Tree a) where
(+) :: (Tree a) (Tree a) -> (Tree a)
instance (Num a) => (+) (Tree a) (Tree a) where
(+) (Node a1 b1 c1) (Node a2 b2 c2) = (Node (a1+a2) ((+) b1 b2) ((+) c1 c2))
(+) Empty (Node a b c) = (Node a b c)
(+) (Node a b c) Empty = (Node a b c)
[OK]をクリックして、クラスをPlusに変更し、functionという名前を付けました。すべての無意味な関数を実装したくないためです。これは新しいコードです。
data Tree a = Node a (Tree a) (Tree a)
|Empty
class Plus a where
plus:: (Tree a) -> (Tree a) -> (Tree a)
instance (Num a) => Plus (Tree a) where
Plus (Node a1 b1 c1) (Node a2 b2 c2) = (Node (a1+a2) (Plus b1 b2) (Plus c1 c2))
Plus Empty (Node a b c) = (Node a b c)
Plus (Node a b c) Empty = (Node a b c)
私は次のエラーが発生します:
Aufgabe10.hs:8:9: インスタンス宣言では許可されていないパターンバインディング(単純変数を除く) プラス(ノードa1 b1 c1)(ノードa2 b2 c2) =(ノード(a1 + a2)(プラスb1 b2)(プラスc1 c2))
Aufgabe10.hs:9:9: インスタンス宣言では許可されていないパターンバインディング(単純変数を除く) プラス空(ノードa b c)=(ノードa b c)
Aufgabe10.hs:10:9: インスタンス宣言では許可されていないパターンバインディング(単純変数を除く) プラス(ノードa b c)空=(ノードa b c)
回答:
回答№1は2を見てみましょう 型クラスとは:型クラスの宣言は次のようになることに気付くでしょう:
- 型クラス名
- 型変数
したがって、宣言は次のように始まります。
class (+) a where
ない
class (+) (Tree a) where
私は好むだろうが
class Plus a where
それはあなたの問題の最初のものを解決します。 :)
更新版に回答しています...
あなたは違いを見ますか? Plus
そして plus
?はい、一方は大文字で、もう一方は大文字ではありません。 Haskellでそれが何を意味するのか知っていますか?
Plus
Haskellの大文字の単語はすべて、 タイプ (この場合、 型クラス と呼ばれる Plus
)。
一方、関数は常に小文字でなければなりません - そしてそれがあなたが定義した理由です plus :: (Tree a) -> (Tree a) -> (Tree a)
小文字で。
あなたはすでに問題を抱えていますか?
の代わりに
instance (Num a) => Plus (Tree a) where
Plus (Node a1 b1 c1) (Node a2 b2 c2) = (Node (a1+a2) (Plus b1 b2) (Plus c1 c2))
Plus Empty (Node a b c) = (Node a b c)
Plus (Node a b c) Empty = (Node a b c)
あなたは書くべきだった
instance (Num a) => Plus (Tree a) where
plus (Node a1 b1 c1) (Node a2 b2 c2) = (Node (a1+a2) (Plus b1 b2) (Plus c1 c2))
plus Empty (Node a b c) = (Node a b c)
plus (Node a b c) Empty = (Node a b c)
関数の動作を定義しているからです plus
いつ Tree
のインスタンスです Plus
。とった? :)