约束类型的同义词

ToZ*_*oZo 2 haskell types constraints synonym

我知道我可以为类型创建同义词,例如:

type ListToArray a e = [e] -> a Int e
Run Code Online (Sandbox Code Playgroud)

我还读到约束类型仍然是一种类型,所以我想我也可以为其创建一个同义词:

type (Data.Array.IArray.IArray a e) => ListToArray a e = [e] -> a Int e
Run Code Online (Sandbox Code Playgroud)

然而 GHC 抱怨道:

parse error on input '=>'
Run Code Online (Sandbox Code Playgroud)

GHC 是否支持约束类型的同义词?

Bak*_*riu 5

你可以查看Haskell 2010 Report,关于类型同义词的部分指出类型同义词的语法是:

\n\n
type simpletype = type\nsimpletype  \xe2\x86\x92   tycon tyvar1 \xe2\x80\xa6 tyvark       (k \xe2\x89\xa5 0) \n
Run Code Online (Sandbox Code Playgroud)\n\n

换句话说:不,你不能将类约束放在 a 的=左侧type的左侧。

\n\n

另请注意,即使在此类声明中的右侧,也不能有类约束=。的定义type是:

\n\n
type    \xe2\x86\x92   btype [-> type]         (function type)\n\nbtype   \xe2\x86\x92   [btype] atype       (type application)\n\natype   \xe2\x86\x92   gtycon\n    |   tyvar\n    |   ( type1 , \xe2\x80\xa6 , typek )       (tuple type, k \xe2\x89\xa5 2)\n    |   [ type ]        (list type)\n    |   ( type )        (parenthesised constructor)\n\ngtycon  \xe2\x86\x92   qtycon\n    |   ()      (unit type)\n    |   []      (list constructor)\n    |   (->)        (function constructor)\n    |   (,{,})      (tupling constructors) \n
Run Code Online (Sandbox Code Playgroud)\n\n

所以type非终结符指的是没有上下文的类型类型。换句话说:不,你不能在类型同义词中拥有上下文,至少在一般情况下不能。

\n\n

GHC 对 Haskell 的类型系统有很多扩展,可以在某些情况下解除上述一些限制(请参阅)。但是,据我所知,没有一个能够完全实现您想要的。

\n