我对Haskell并不十分精通,所以这可能是一个非常简单的问题.
Rank2Types解决了什么语言限制?Haskell中的函数是否已经支持多态参数?
编译好:
type List a = [a]
Run Code Online (Sandbox Code Playgroud)
但是当我引入类约束时,编译器要求RankNTypes包括:
type List2 a = Num a => [a]
Run Code Online (Sandbox Code Playgroud)
包含该扩展后,它编译得很好.为什么编译代码需要扩展名?
编辑:为什么我首先需要约束?
我检查这个镜头类型(type RefF a b = Functor f => (b -> f b) -> (a -> f a)从)这个职位,并发现它实际需要的RankNTypes,因为的Functor约束.
随意更改标题,我只是没有经验足以知道真正发生了什么.
所以,我是基于这个松散地编写一个程序,并写了这个(因为它在原文中)
type Row a = [a]
type Matrix a = [Row a]
Run Code Online (Sandbox Code Playgroud)
没什么特别的.但是,我发现自己编写了几个类似这样的函数:
Eq a => Row a -> ...
Run Code Online (Sandbox Code Playgroud)
所以我想也许我可以将这个约束写入类型同义词定义中,因为在我看来它不应该那么复杂,对吧?如果编译器可以在函数中使用它,它应该作为类型同义词.这里没有部分申请,也没有任何或某种诡计(对我来说).
所以我尝试了这个:
type Row a = Eq a => [a]
Run Code Online (Sandbox Code Playgroud)
这不起作用,编译器建议启用RankNTypes.该选项使其编译,但函数仍然需要我留下Eq a =>他们的类型声明.顺便说一句,如果我尝试使用type Matrix a = [Row a]类似之前的类型同义词,则会导致错误.
所以我的问题是这样的:
是否可以在其定义中使用类型类型同义词和类型类约束?
这个问题背后的目标是否可以通过其他方式实现?
我知道我可以为类型创建同义词,例如:
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 是否支持约束类型的同义词?