4

そのようなコードは、本「Real World Haskell」の p68 で見つけました。

data Tree a = Node a (Tree a) (Tree a)
            | Empty
              deriving (Show)

nodeAreSame (Node a _ _) (Node b _ _)
            | a == b = Just a
nodeAreSame _ _ = Nothing

私の質問は次のとおりです。データ コンストラクターはどのような仕事をしましたJustか? 削除すると、次のようなエラーメッセージが表示されます

(in ghci)
......
<Main *> nodeAreSame (Node 3 Empty Empty) (Node 3 Empty Empty))  

<interactive>:1:16:  
    No instance for (Num (Maybe a))
......

しかし、「Just」バージョンと「No Just」バージョンのタイプの違いを比較しようとすると、次のようになります。

nodeAreSameJust   :: (Eq t) => Tree t -> Tree t -> Maybe t

nodeAreSameNoJust :: (Eq a) => Tree (Maybe a) -> Tree (Maybe a) -> Maybe a

では、ここでのキーポイントは何ですか?ノードにvar with type を配置するとa、関数は type のノードを出力しないaため、エラーが発生するということですか?

4

3 に答える 3

12

実際、がなくても型付けが正しくないわけではありJustません。

これが取引です。コード

nodeAreSame (Node a _ _) (Node b _ _)
            | a == b = a
nodeAreSame _ _ = Nothing

aの型であるため、とが一部bの の型である場合、適切に型付けされます。したがって、型システムはこの推論を行います。Maybe ttNothing

現在、 のような数値リテラルがある場合、実際に特定のデータ型 (または など)にコミットするまで3、型であると推論されます。Num s => sIntDouble

したがって、これら 2 つの事実をまとめると、次のように推測されます。

Num (Maybe t) => 3 :: Maybe t.

のインスタンスがないため、意味をなさないNum (Maybe t)文句を言う機会を得る前に、その時点で文句を言います。3 :: Maybe t

于 2010-07-16T05:00:10.643 に答える
3

他に何を返すと思いますaか? とは同じ型ではないため、これaは機能しません。Nothing関数のすべての定義は、同じ型を返す必要があります。 Nothingどちらも type であるため、Just a一致しますMaybe a

于 2010-07-16T04:29:23.810 に答える
2

Just バージョンでは、ツリー内の項目のタイプが Maybe a である必要があります。

エラーが Num (多分 a) のインスタンスである理由が完全にはわかりません。3 の代わりに文字列を使用すると、エラーがよりわかりやすいと思います。

*Main> nodeAreSameNoJust (Node "arst" Empty Empty) (Node "arst" Empty Empty)
<interactive>:1:24:

Couldn't match expected type `Maybe a'
       against inferred type `[Char]'
In the first argument of `Node', namely `"arst"'
In the first argument of `nodeAreSameNoJust', namely
    `(Node "arst" Empty Empty)'
In the expression:
    nodeAreSameNoJust
      (Node "arst" Empty Empty) (Node "arst" Empty Empty)

ここでは、Maybe a 型の何かを期待していることはより明確です。どちらの場合も、関数の 2 番目のケースは Nothing であるため、結果の型は Maybe a であると推測されます。Just を含めることで、ツリーで使用する値が Maybe 型に入れられます。これがないと、関数の各部分が同じ型である必要があるため、結果の a が Nothing と同じ型であることが期待されます。

于 2010-07-16T04:30:17.473 に答える