几个小时前,我建立了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] aa a都不能简化为a),那么为什么不编译呢?

最佳答案

我浏览了一下邮件文件。不幸的是,似乎a ~ b并不排除a ~ [b]的可能性,因为这种废话是可以接受的:

type family G = [G]

结果,在Combine a a实例中,当我们调用C a a来查找返回类型应该是什么时,就不可能减少:因为我们对a并不了解,所以我们还不知道是否选择C a aC a [a]类型族的C分支,我们还不能进行任何简化。

this mailing list thread中有更多详细信息,在下个月的by-thread archive中有大量后续 Activity (似乎很难从上一个链接中找到)。尽管我不确定会有更好的解决方案,但整个情况对我来说似乎有点奇怪。

关于haskell - 封闭式家庭无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19350323/

10-14 23:33