Рассмотрим следующий сеанс 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)
? - person Benjamin Hodgson♦   schedule 04.09.2017union
(гдеMySet
встречается в типе несколько раз) и вообще невозможно дляfromList
. - person Sebastian Graf   schedule 04.09.2017