型クラスの定数値を宣言する方法:私が実装されていない一定の値を使用し、いくつかの実装の機能を持つ型クラス(<code>table</code>)を宣言したい
class FromRow a => StdQueries a where
table :: String
byId :: Int -> QueryM (Maybe a)
byId = fmap listToMaybe . queryM sql . Only
where sql = read $ "SELECT * FROM " ++ table ++ " WHERE id = ?"
考え方は単純です:私はしたいです
instance StdQueries SomeType where
table = "the_constant_value_for_this_type"
しかし、コンパイラは、次のメッセージで訴えて続けて:ちょうどtable
を指定することで、この型クラスをインスタンス化することによって利用可能byId
(および他の類似の機能)を取得
The class method `table'
mentions none of the type variables of the class StdQueries a
When checking the class method: table :: String
In the class declaration for `StdQueries'
この種の問題の解決策はありますか? newtype
のヘルプなどでトリックすることはできますか?
これはあまり間違っていませんが、多くのタイプのクラスはこのようにします。 – leftaroundabout
コードをより読みやすくするためにフォーマットしてください。また、これは本当に機能しますか?今は 'table'を関数にしているようですが、' where sql = ... 'の部分ではそれを使用していません。 – ErikR
テーブルの型は 'a - > String'であり、' String'ではありません。どうして連結しますか? – Satvik