3

Haskell を学び始めたばかりで、「Learnyouahaskell」という本に従っています。この例に出くわしました

tell :: (Show a) => [a] -> String  
tell [] = "The list is empty"  

(Show a)ここにクラス制約とパラメーターのタイプがあることを理解しています。この場合、 a「表示可能」にする必要があります。

ここにリストがあり、リストの要素ではないことを考えるとa、なぜ次のような関数を宣言できないのですか:-

tell :: (Show a) =>a->String

編集1:-以下の回答から、aパターンマッチングの具体的なタイプを指定する必要があることを理解しているようです。これを考慮すると、以下の正しい実装は何でしょうか:-

pm :: (Show a) =>a->String
pm 'g'="wow"

以下のようなエラーが表示されます

 Could not deduce (a ~ Char)
from the context (Show a)
  bound by the type signature for pm :: Show a => a -> String
  at facto.hs:31:7-26
  `a' is a rigid type variable bound by
      the type signature for pm :: Show a => a -> String at facto.hs:31:7
In the pattern: 'g'
In an equation for `pm': pm 'g' = "wow"

失敗しました。モジュールがロードされました: なし。

エラー メッセージから、 の具象型を推測できないことは理解aできますが、 を使用してどのように宣言できますかShow

私はこのように上記を解決できることを知っています:-

pmn :: Char->String
pmn 'g'="wow"

しかし、私は型クラスをShow正しく理解しようとしているだけです

4

5 に答える 5

2

「g」でパターンマッチするとすぐに、例えば

pm 'g' = "wow"

あなたの関数はもはや(Show a) => a -> String;の型を持っていません。代わりに、「a」の具象型、つまり Char があるため、次のようになります。Char -> String

これは、関数が任意の型 'a' で動作することを示す明示的な型署名と直接競合しています (その型が のインスタンスである限りShow)。

Int や Char などでパターン マッチングを行っているため、この場合はパターン マッチングを行うことはできません。ただしshow、Prelude で関数を使用することはできます。

pm x = case show x of
             "'g'" -> "My favourite Char"
             "1"   -> "My favourite Int" 
             _     -> show x

ご想像のとおりshow、少し魔法のようです ;)。show実際には、型クラスのインスタンスである型ごとに実装された関数がたくさんありますShow

于 2013-06-19T06:55:08.097 に答える