/ / Haskellクラス宣言内の予期しない型 - クラス、haskell

クラス宣言のHaskellの予期しない型 - クラス、haskell

(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

を見てみましょう 型クラスとは:型クラスの宣言は次のようになることに気付くでしょう:

  1. 型クラス名
  2. 型変数

したがって、宣言は次のように始まります。

class (+) a where

ない

class (+) (Tree a) where

私は好むだろうが

class Plus a where

それはあなたの問題の最初のものを解決します。 :)


更新版に回答しています...

あなたは違いを見ますか? Plus そして plus?はい、一方は大文字で、もう一方は大文字ではありません。 Haskellでそれが何を意味するのか知っていますか?

PlusHaskellの大文字の単語はすべて、 タイプ (この場合、 型クラス と呼ばれる 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。とった? :)