Haskell Constraint Kinds - 默认实现的默认约束

时间:2014-07-28 14:32:39

标签: haskell constraint-kinds

标题:我想为通过约束参数化的类方法提供默认实现,该约束使用该约束的默认实例。

请考虑以下事项:

{-# 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的默认约束,这将允许这个编译。有什么理由不起作用,或者有人能提出一个很好的方法来实现这个目标吗?

1 个答案:

答案 0 :(得分:9)

您可以使用DefaultSignatures

来实现此目的
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE DefaultSignatures #-}

import GHC.Exts (Constraint)

class Foo a where
  type Ctx a :: Constraint
  type Ctx a = Show a

  foo :: (Ctx a) => a -> String

  default foo :: Show a => a -> String
  foo = show

main :: IO ()
main = putStrLn "Compiles!"
  

从我的角度来看,它应该使用Show的默认约束,这将允许这个编译。

您的方法不起作用的原因是您的类的用户应该能够覆盖任意数量的默认值。如果有人试图覆盖Ctx而不是foo,则代码会中断。