考虑以下GHCI会议:`coerce`和类型变量的实例
>: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
许多发生。
'member'ks = member k(coerce s)''怎么样? –
好的想法,但是对于'union'(其中'MySet'在类型中多次出现)而言,这是非常详细的,并且根本不可能用于'fromList'。 –
我认为这可能是GHC中的一个相当大的错误,当然值得一票。或者在牛津与理查德交谈:-) –