为什么多态类型同义词不像实例中的多态数据声明那样工作?

时间:2014-01-15 23:07:44

标签: haskell

Vec2正在作为数据声明工作,但在这种情况下我尝试使用元组废弃我的样板:

{-# LANGUAGE FlexibleInstances #-}

type Vec2 a = (a,a)

class Vector v where 
  foo :: v Integer

instance Vector Vec2 where 
  foo = (1,2)

1 个答案:

答案 0 :(得分:5)

无法部分应用类型同义词。由于它们本质上是类型级函数,因此决定部分应用的类型同义词之间的相等性类似于决定扩展等价。

你很有能力做一些像

这样的事情
{-# LANGUAGE FlexibleInstances #-}
instance Foo String where
  ...

String完全应用以来。然而,有一种解决方法,因为类型是curry,在某些情况下你可以编写像

这样的东西
 type Arr = ((->) Int)

并为此创建实例,因为类型同义词是“完全应用”。

在这种情况下,无法实现聪明的eta转换,因此您将不得不使用新类型,

newtype SimplePair a = SimplePair {unSimplePair :: (a, a)}