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

本当の答えではありませんが、これは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 に答える
4

これは、7.4.1の関連するタイプのデフォルトのバグです。数週間前、#haskellで修正された既知のバグであると言われましたが、GHCトラックでその言及を見つけることができません。

于 2012-04-30T15:26:54.920 に答える