考慮以下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中的一個相當大的錯誤,當然值得一票。或者在牛津與理查德交談:-) –