相关疑难解决方法(0)

Rank2Types的目的是什么?

我对Haskell并不十分精通,所以这可能是一个非常简单的问题.

Rank2Types解决了什么语言限制?Haskell中的函数是否已经支持多态参数?

polymorphism haskell types higher-rank-types

106
推荐指数
5
解决办法
1万
查看次数

为什么类型同义词中的类约束需要RankNTypes

编译好:

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约束.

haskell higher-rank-types haskell-lens

25
推荐指数
1
解决办法
1897
查看次数

具有类型类约束的类型同义词是否可行?

随意更改标题,我只是没有经验足以知道真正发生了什么.

所以,我是基于这个松散地编写一个程序,并写了这个(因为它在原文中)

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]类似之前的类型同义词,则会导致错误.

所以我的问题是这样的:

  • 是否可以在其定义中使用类型类型同义词和类型类约束?

    • 如果没有,为什么?
  • 这个问题背后的目标是否可以通过其他方式实现?

haskell typeclass

5
推荐指数
1
解决办法
274
查看次数

约束类型的同义词

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

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 是否支持约束类型的同义词?

haskell types constraints synonym

2
推荐指数
1
解决办法
314
查看次数