标题:我希望为一个参数化的约束类方法提供默认实现,该实现使用该约束的默认实例。
考虑以下情况:
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE TypeFamilies #-}
import GHC.Exts (Constraint)
class Foo a where
type Ctx a :: Constraint
type Ctx a = Show a
foo :: (Ctx a) => a -> String
foo = show
main :: IO ()
main = putStrLn "Compiles!"
这段代码编译失败,报错如下:
Could not deduce (Show a) arising from a use of ‘show’ from the context (Foo a)
从我的角度来看,应该使用默认的Show
约束条件,这样可以使代码编译通过。是否有任何原因导致这不起作用,或者是否有人能够建议一个良好的方法来实现这一点?
Ctx
但没有覆盖foo
的实例会拒绝编译。不过,这看起来是一个很好的解决方案! - Impredicative