封闭式家庭不能按预期工作

Art*_*yom 7 haskell type-families

几个小时前,我建造了GHC HEAD来试验新的闪亮封闭式系列.

{-# LANGUAGE TypeFamilies, MultiParamTypeClasses, FlexibleInstances #-}

type family C a b where
  C  a [a] = [a]
  C  a  a  = [a]
Run Code Online (Sandbox Code Playgroud)

现在我尝试C使用:

class Combine a b where
  combine :: a -> b -> C a b

instance Combine a [a] where
  combine a b = a : b

instance Combine a a where
  combine a b = [a, b]
Run Code Online (Sandbox Code Playgroud)

导致此错误:

Couldn't match expected type ?C a a’ with actual type ?[a]’
...
In the expression: [a, b]
In an equation for ?combine’: combine a b = [a, b]
In the instance declaration for ?Combine a a’
Run Code Online (Sandbox Code Playgroud)

在我看来,第二个等式与第一个等式不同(不管是什么[a] a都不能简化),为什么不编译?a aa

Dan*_*ner 7

我仔细查看了邮件档案.不幸的是,似乎a ~ b并不排除这种可能性a ~ [b],因为这种废话被接受了:

type family G = [G]
Run Code Online (Sandbox Code Playgroud)

因此,在实例中Combine a a,当我们调用C a a以找出返回类型应该是什么时,不可能减少:因为我们什么都不知道a,我们还不知道是否选择类型C a aC a [a]分支C类型家人,我们还不能做任何减少.

这个邮件列表主题中有更多详细信息,它在下个月的by-thread存档中有大量后续内容(似乎很难从上一个链接中找到).对我来说,整个情况实际上似乎有点奇怪,尽管我不确定什么是更好的解决方案.

  • 似乎可能的解决方法是将第二个实例更改为`instance(C aa~ [a])=>组合aa where ...`(并启用`UndecidableInstances`).对于具体类型的"a"实例化,可以减少LHS. (3认同)
  • (另外,我写了一封电子邮件给Richard Eisenberg,负责新的封闭式家庭功能的人,以确认这个解释,因为我不确定我是否完全理解.他同意.) (2认同)