Seb*_*raf 8 haskell unification coerce
考虑以下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 @_ @())
Run Code Online (Sandbox Code Playgroud)
我对这里发生的事情抱有预感:类型检查器需要满足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 :: Ord a => a -> Map a b -> Bool
member' :: Ord a => a -> MySet a -> Bool
Run Code Online (Sandbox Code Playgroud)
GHC 需要接受
Coercible (Map a b) (MySet a)
Run Code Online (Sandbox Code Playgroud)
它看到
Coercible (MySet a) (Map a ())
Run Code Online (Sandbox Code Playgroud)
这使得它需要
Coercible (Map a ()) (Map a b)
Run Code Online (Sandbox Code Playgroud)
这导致
Coercible () b
Run Code Online (Sandbox Code Playgroud)
但什么是b?这是模棱两可的。在这种情况下,什么并不重要b,因为根据参数性,member不可能关心。b ~ ()因此,选择并简单地解决强制是完全合理的。但GHC一般不会在类型推断中进行这样的参数分析。我怀疑改变这一点可能很棘手。最特别的是,任何时候类型推断“猜测”时,都存在猜测错误并阻碍其他地方推断的风险。这是一大堆蠕虫。
至于你的问题,我也没有什么好的解决办法。当您有多个具有相似模式的函数时,您可以将它们抽象出来,但您仍然会面临很大的烦恼。