7

几个小时前,我构建了 GHC HEAD 来试验新的闪亮封闭类型系列。

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

type family C a b where
  C  a [a] = [a]
  C  a  a  = [a]

现在我尝试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]

导致此错误:

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’

在我看来,第二个等式第一个等式不同(无论如何[a] a都不能简化为),那么它为什么不编译呢?a aa

4

1 回答 1

7

我稍微浏览了邮件档案。不幸的是,这似乎a ~ b并不排除这种可能性a ~ [b],因为这种废话被接受了:

type family G = [G]

结果,在 instance 中Combine a a,当我们调用C a a找出返回类型应该是什么时,不可能进行归约:因为我们对 不了解a,所以我们还不知道是否选择类型的C a aorC a [a]分支C家人,我们还不能做任何减少。

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

于 2013-10-13T22:57:21.893 回答