9

我在定义默认约束时遇到了一个奇怪的问题。如果约束是单位,则不选择默认实例。在所有其他情况下,它按预期工作。

{-# LANGUAGE TypeFamilies, ConstraintKinds #-}
import qualified GHC.Exts as E

class Expression a where
  type Constr a v :: E.Constraint
  --type Constr a v = ()         -- with this line compilation fails
  --type Constr a v = v ~ v      -- compiles
  wrap :: Constr a v => a -> Maybe v

instance Expression () where
  wrap () = Just undefined

main = print (wrap () :: Maybe Int)

有人可以澄清类型检查器行为的原因吗?

4

2 回答 2

4

这是 7.4.1 中关联类型默认值的错误。几周前,我在#haskell 上被告知这是一个已修复的已知错误,但我在 GHC trac 上找不到它的提及。

于 2012-04-30T15:26:54.920 回答
4

不是真正的答案,但这不是关于ConstraintKinds

class Expression a where
   type Type a v
   type Type a v = ()
   wrap :: (Type a v) ~ () => a -> Maybe v

instance Expression () where
   wrap () = Just undefined

main = print (wrap () :: Maybe Int)

不编译,但是

class Expression a where
   type Type a v
   type Type a v = v
   wrap :: (Type a v) ~ v => a -> Maybe v

instance Expression () where
   wrap () = Just undefined

main = print (wrap () :: Maybe Int)

于 2012-04-30T10:08:11.183 回答