【发布时间】:2017-09-04 07:36:33
【问题描述】:
考虑以下 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。
【问题讨论】:
-
member' k s = member k (coerce s)怎么样? -
好主意,但是这对于
union来说变得非常冗长(其中MySet在类型中出现多次)并且对于fromList根本不可能。 -
我认为这可能是 GHC 中的一个相当大的错误,当然值得一张票。或者在牛津和理查德谈谈 :-)
-
@JoachimBreitner,我怀疑这很难解决。看我的回答。当然,你和理查德都比我知道的多。
标签: haskell unification coerce