考虑以下 GHCi 会话:
>:set -XTypeApplications
>import Data.Map.Strict
>import GHC.Exts
>newtype MySet a = MySet (Map a ())
>let member' :: Ord a => a -> MySet a -> Bool; member' = coerce member
<interactive>:21:57: error:
* Couldn't match representation of type `a0' with that of `()'
arising from a use of `coerce'
* In the expression: coerce member
In an equation for member': member' = coerce member
>let member' :: Ord a => a -> MySet a -> Bool; member' = coerce (member @_ @())
我对这里发生的事情有预感:类型检查器需要满足Coercible (Ord a => a -> Map a b -> Bool) (Ord a => a -> MySet a -> Bool)
并且无法b
在此约束中实例化为()
.
有没有比这样做更优雅的方法-XTypeApplications
?
编辑:我特别在寻找处理MySet a
类型中许多出现的解决方案,例如union :: Ord a => MySet a -> MySet a -> MySet a
.