几个小时前,我建造了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 a
,无论a
),为什么不编译?
答案 0 :(得分:7)
我仔细查看了邮件档案。不幸的是,似乎a ~ b
并未排除a ~ [b]
的可能性,因为接受了这种废话:
type family G = [G]
因此,在实例Combine a a
中,当我们调用C a a
以找出返回类型应该是什么时,不可能减少:因为我们对{{1}一无所知}},我们还不知道是否选择a
类型系列的C a a
或C a [a]
分支,我们还无法进行任何缩减。
this mailing list thread中有更多细节,在下个月的by-thread archive中有很多后续内容(似乎很难从上一个链接中找到)。对我来说,整个情况实际上似乎有点奇怪,虽然我不确定什么是更好的解决方案。