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
我仔细查看了邮件档案.不幸的是,似乎a ~ b并不排除这种可能性a ~ [b],因为这种废话被接受了:
type family G = [G]
Run Code Online (Sandbox Code Playgroud)
因此,在实例中Combine a a,当我们调用C a a以找出返回类型应该是什么时,不可能减少:因为我们什么都不知道a,我们还不知道是否选择类型C a a或C a [a]分支C类型家人,我们还不能做任何减少.
这个邮件列表主题中有更多详细信息,它在下个月的by-thread存档中有大量后续内容(似乎很难从上一个链接中找到).对我来说,整个情况实际上似乎有点奇怪,尽管我不确定什么是更好的解决方案.