几个小时前,我建立了GHC HEAD来测试新的 Shiny 封闭型系列。
{-# 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
),那么为什么不编译呢? 最佳答案
我浏览了一下邮件文件。不幸的是,似乎a ~ b
并不排除a ~ [b]
的可能性,因为这种废话是可以接受的:
type family G = [G]
结果,在
Combine a a
实例中,当我们调用C a a
来查找返回类型应该是什么时,就不可能减少:因为我们对a
并不了解,所以我们还不知道是否选择C a a
或C a [a]
类型族的C
分支,我们还不能进行任何简化。this mailing list thread中有更多详细信息,在下个月的by-thread archive中有大量后续 Activity (似乎很难从上一个链接中找到)。尽管我不确定会有更好的解决方案,但整个情况对我来说似乎有点奇怪。
关于haskell - 封闭式家庭无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19350323/