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
正しく理解しようとしているだけです